Wodar Hospur Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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 , Spezialisten beantwortet paar Fragen, damit ich nicht noch mehr meiner Zeit in belanglosen Kleinigkeiten reinstecke muss. Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 (bearbeitet) mit welcher entwicklungsumgebung arbeitest du denn und welche progrmmiersprache willst du einsetzen? Bearbeitet 1. Oktober 2008 von pit030771 Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 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. Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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. Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 (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 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 1. Oktober 2008 von Wodar Hospur Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 nö ole solltes du nicht brauchen. FÜR die schnittstelle musst du noch eine klasse hinzufügen. Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 Ich brauche Ole für das Interface, die Applikation die das COM Object nutzt (ein CRM System) erwartet die Daten als OleVariant. Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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. Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 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? Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 was soll das denn sein, eine schnittstelle? oder eine testfunktion? was für daten sollt du denn zurückgeben über die schnittstelle. was wilst du genau machen? Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 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...? Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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. Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 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; Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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. Zitieren
Wodar Hospur Geschrieben 1. Oktober 2008 Autor Geschrieben 1. Oktober 2008 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? Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 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. Zitieren
pit030771 Geschrieben 1. Oktober 2008 Geschrieben 1. Oktober 2008 CodeProject: COM in plain C. Free source code and programming help Zitieren
Empfohlene Beiträge
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.