Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

für einen Adapter zwischen verschiedenen Anwendungen muss ich einen inproc COM Server implementieren. Aber wegen den bruchstückhaften Informationen hangeln ich mich nur recht mühsam umher, ich hab zwar jetzt schon von Threadunterschieden gelesen und auch ist mir zu Ohren gekommen das ich mich in die Registry Eintragen muss. Aber ich muss das doch bestimmt nicht per Hand machen, da wird es doch was schönes aus dem Hause Microsoft, Borland, wer-auch-immer geben.

Ich möchte eigentlich auch garnicht selber irgendwelche COM Objekte aufrufen. Ich muss einfach nur paar Methoden entwickeln die von dieser Anwendung dann aufgerufen werden. Wie implementiere ich eine Fremde, vorgegebene COM Schnittstelle, ist IDL der Weg. Hoffe ihr seht wo ich etwas festhänge, daher möcht ich einfach paar erfahrenere Stimme hören:

- Mit welchen Werkzeugen implementiert ihr COM

- Welche gute Adressen und Informationsmöglichkeiten gibt es (MSDN, CodeGuru, kenn ich, haben mir aber nur ganz minimal geholfen)

- Was sind so eure Worst Case Fallstricke gewesen, die euch einfach unglaublich viel Zeit gekostet haben

- Habt ihr es von Anfang an verstanden oder gab es einen Moment wo es Klick gemacht hat und wenn ja, was hat diesen Klick ausgelöst

- Welchen Tipp würdet ihr einem engagierten, aber unerfahrenen Programmierer mit auf dem Weg geben

Hoffe einfach paar von euch, und ich weiß das es euch gibt :D, Spezialisten beantwortet paar Fragen, damit ich nicht noch mehr meiner Zeit in belanglosen Kleinigkeiten reinstecke muss.

Geschrieben

Also ich bin offen zwischen C++ oder auch .Net, aber würde schon C++ bevorzugen. Als Programmierumgebung habe ich zurzeit ein Visual Studio .Net 2003. Wäre aber auch offen für was anderes, aber beim Borland Builder hatte ich mich erstmal garnicht wohl gefühlt.

Geschrieben

in vs kannst du das auch über den anwendungsassistenten erstellen.

du musst ein atl projekt erstellen, dann entweder einen dll oder exe, wie du magst. dll, ist vieleicht für den anfang einfacher.

wenn du die erstellt hast, kannst du in den projekteinstellungen unter post build events diese dll nach dem komilieren mit regsvr32 -meinedll.DLL registrieren.

den letzten schritt kannst du auch manuell über cmd (admin rechte) machen.

in dem projekt selber kannst du so aggieren wie in einem normalen anderen projekt und methoden hinzufügen zu deiner schnittstelle. den rest erledigt der compiler.

Geschrieben (bearbeitet)

Okay, jetzt kommen zwei Probleme, denn das hatte ich schon probiert.

a) brauche ich Ole, das haut mir der Compiler aber mit "Window.h ist schon deklariert" um die Ohren

B) ist doch ATL afaik muss ich das Interface jetzt in der Klasse definieren oder muss ich es als Funktion schreiben?

Auch frag ich mich wenn ich dann im Source Code sowas lese:

//CAtlDllModuleT-Member überschreiben

Muss ich das, heißt das ich überschreibe die DllRegister und dergleichen oder?

Bearbeitet von Wodar Hospur
Geschrieben

die klasse COleVariant ist doch abgeletet von VARIANT, das solltets du so benutzen können.

und ole wird schon automatisch included, da musst du nix mehr extra includen, wenn ich mich nicht irre.

Geschrieben

COleVariant GetDeletedRecords(void)

{

   COleVariant bla;

   return bla;

}
brignt mir leider diese Fehlermeldung:
f:\Code\comtest1\comtest1.cpp(23) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'GetDeletedRecords'

f:\Code\comtest1\comtest1.cpp(23) : error C2501: 'COleVariant': Fehlende Speicherklasse oder Typspezifizierer

f:\Code\comtest1\comtest1.cpp(25) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'bla'

f:\Code\comtest1\comtest1.cpp(25) : error C2065: 'bla': nichtdeklarierter Bezeichner

f:\Code\comtest1\comtest1.cpp(26) : error C3861: 'bla': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

Was für mich auf eine fehlende Deklaration hinweist?

Aber zu der Klasse die ich Hinzufügen soll, die muss ich doch mit dem Rest doch dann verdrahten, soweit ich es verstanden hab gibt es doch irgendwo eine Factory die dann Instanzen erzeugen sollte?

Geschrieben

Okay, folgendes, es wird eine CRM Software eingeführt. Diese nutzt sehr viel das COM System. Jetzt sollen aber bestimmte Informationen aus dem ERP System im Grunde per ODBC rausgelesen werden.

Das CRM System ist erfreulicherweise sehr Modular aufgebaut und genau dafür kann ich eigen definierte COM Objekte schreiben. Diese gebe ich dem CRM System über einen Registry Schlüssel mit, der die UUID enthält.

Dabei greift es auf dokumentiere Funktionen zu, z.b. GetDeletedRecord, Get...

Diese liefern als OleVariant ein XML Dokument zurück das die benötigten Informationen enthält.

Da ich mich leider nicht mit COM auskenne, stelle ich mir jetzt Fragen wie:

wo muss ich diese Funktionen definieren, in einer Klasse, einfach so, wie funktioniert der Zugriff.

Im Source habe ich von dem CRM System nichts. Daher frag ich mich muss ich diese Schnittstellen selber definieren, Stichwort vtable...?

Geschrieben

Okay, folgendes, es wird eine CRM Software eingeführt. Diese nutzt sehr viel das COM System. Jetzt sollen aber bestimmte Informationen aus dem ERP System im Grunde per ODBC rausgelesen werden.

von welcher stelle in eurem projekt sollst du diese daten lesen?

aus dem crm?

Das CRM System ist erfreulicherweise sehr Modular aufgebaut und genau dafür kann ich eigen definierte COM Objekte schreiben. Diese gebe ich dem CRM System über einen Registry Schlüssel mit, der die UUID enthält.

wenn das doch schon com schnittstellen hat, dann implementier deine methoden doch da. ist das euer eigenes projekt oder eines das ihr erweitert, quasi per addons?

Dabei greift es auf dokumentiere Funktionen zu, z.b. GetDeletedRecord, Get...

Diese liefern als OleVariant ein XML Dokument zurück das die benötigten Informationen enthält.

wo sind diese methoden implemntiert?

Da ich mich leider nicht mit COM auskenne, stelle ich mir jetzt Fragen wie:

wo muss ich diese Funktionen definieren, in einer Klasse, einfach so, wie funktioniert der Zugriff.

wenn du ein eigenes projekt als typelib anlegst, dann muss du die schnittstelle als klasse(c++) oder als struct© anlegen, com geht nur über funtionspointer.

Geschrieben
von welcher stelle in eurem projekt sollst du diese daten lesen?

aus dem crm?

Also in dem Projekt sollen zwei unidirektionale Kanäle zwischen CRM und ERP System realisiert werden. Die Daten aus dem CRM System bekomme ich zugeschickt, die Daten aus dem ERP System lese ich aus, in diesen COM Objekten, aber das Auslesen macht mir zurzeit noch weniger Sorgen, da ich schonmal so einen Zugriff auf ne ODBC Datenbank aufgebaut habe.

wenn das doch schon com schnittstellen hat, dann implementier deine methoden doch da. ist das euer eigenes projekt oder eines das ihr erweitert, quasi per addons?

Genau meine COM Objekte werden als "Addons" eingebunden und entsprechend angesprochen. Diese Addons werden als eigenes geschrieben, die CRM Software ist closed Source eingekauft.

wo sind diese methoden implemntiert?

In meinen COM Objekten sollen diese von dem CRM System dann aufgerufenen Methoden realisiert werden.

wenn du ein eigenes projekt als typelib anlegst, dann muss du die schnittstelle als klasse(c++) oder als struct© anlegen, com geht nur über funtionspointer.

Jetzt wird es interessant, das verstehe ich nicht ganz. Also grob was ich mir jetzt zusammengereimt habe, daher ja mein Wunsch nach einer Anleitung:

Eine Anwendung ruft ein COM Objekt auf und kann dann dessen Methoden aufrufen. Jetzt stehe ich halt vor der Aufgabe und muss ein COM Objekt mit diesen Methoden realisieren. Wenn du jetzt sagst COM basiert auf Funktionspointer, wie müsste ich das dann realsieren, die Dokumentation meines CRM Systems sagt mir einfach nur:

Implementiere Methode GetDeletedRecords, die muss zurückliefern ein XML Dokument mit den und den Eigenschaften. Müsste ich jetzt also schreiben...


COleVariant meineImplementierung(void) 

{

   return irgend_was;

}



// wo müsste ich jetzt diese Stück Code einbauen, in das COM Objekt?

COleVariant (*GetDeletedRecords)(void) = meineImplementierung;

Geschrieben

Eine Anwendung ruft ein COM Objekt auf und kann dann dessen Methoden aufrufen. Jetzt stehe ich halt vor der Aufgabe und muss ein COM Objekt mit diesen Methoden realisieren. Wenn du jetzt sagst COM basiert auf Funktionspointer, wie müsste ich das dann realsieren, die Dokumentation meines CRM Systems sagt mir einfach nur:

das erledigt der compiler.

du musst das projekt wie ober beschrieben erstellen, dort fügst du eine ATL Klasse mit COM unterstützung hinzu.

und in der klassenansicht kannst du in dem interface (ist bezeichnet mit Iiregenwas) methode hinzufügen.

damit hast du ein comprojekt.

registrierung läuft auch wie oben beschrieben.

Implementiere Methode GetDeletedRecords, die muss zurückliefern ein XML Dokument mit den und den Eigenschaften. Müsste ich jetzt also schreiben...

Code:

COleVariant meineImplementierung(void)

{

return irgend_was;

}

// wo müsste ich jetzt diese Stück Code einbauen, in das COM Objekt?

COleVariant (*GetDeletedRecords)(void) = meineImplementierung;

das müsste dann wieder in einer klasse sein, die hinter der com schnittstelle liegt.

die com methoden selber geben nur HRESULT zurück. un return werte über die parameterliste. aber in diesen com methoden kannst natürlich deine methode aurufen.

und aus einem OleVariant kannst du einen VARIAN machen und den zurückgeben.

aber wie das genau auszusehen hat muss dann in der doku von eurem crm stehen.

Geschrieben

Okay, ich versuch einfach mal deine Tipps alle mal in meinen Code einfließen zu lassen, danke für deine Zeit und Hilfe, eine Frage noch, hast du vielleicht einen Tipp mit dem ich mich noch etwas weiter einarbeiten kann?

Geschrieben

gerne. :) hoffe es hilft.

CodeProject: COM / COM+. Free source code and programming help

da gibt es auch ein beginners, da wird das ganz gut erklärt.

das fand ich ganz gut.

erstell am besten erst mal kleine test projekte für dich, in denen du 1 bis 2 methoden implementierst die dann auch was am scteen darstellen, ne blöde messge box zb.

diese methoden musst du dann über die com schnittstelle natürlich aus einem anderen projekt(mfc beispielsweise) aufrufen. dann lernst du auch gleich com aufrufe.

ist auch ziemlich komplex das ganze, aber wenn man es einmal verstanden hat schon cool.

wenn noh fragen sind schreib mir ne PM.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...