C# DLL aus C++ ansprechen
-
Hallo zusammen,
ich habe eine Interop DLL die über COM angesprochen werden soll. Ich habe bereits alle DLL's via Regasm registriert(x86 und x64) und schaffe es mit dem folgenden Code nicht, eine lauffähige Instanz zu erstellen:-( Hat jemand von euch eine Idee oder einen Tipp? Braucht ihr noch mehr Informationen vielleicht?
#include "windows.h" #import "D:\EASY\doku\EBIS\EBIS-1.1.28\clientBundles\ms.net\Easy.Business.Interop.tlb" named_guids rename_namespace("EASY") //raw_interfaces_only using namespace EASY; int main(int argc, char* argv[]) { CoInitialize(NULL); EASY::IClientService *pClientInterface = NULL; //pClientInterface = (IClientService*)malloc(sizeof(IClientService)); //pClientInterface->CreateAdminContext("", ""); //EASY::IServiceResource *pserviceResource = NULL; //HRESULT hRes2 = CoCreateInstance(EASY::CLSID_IServiceResource, NULL, CLSCTX_INPROC_SERVER, EASY::IID_IServiceResource, reinterpret_cast<void**> (&pserviceResource)); //EASY::IAdminContext *padminContext = NULL; //HRESULT hRes = pClientInterface->CreateAdminContext("", ""); HRESULT hRes = CoCreateInstance(EASY::CLSID_ClientService, NULL, CLSCTX_INPROC_SERVER, EASY::IID_IClientService, reinterpret_cast<void**> (&pClientInterface)); //HRESULT hRes = CoCreateInstance(__uuidof(ClientService), NULL, CLSCTX_INPROC_SERVER, EASY::IID_IClientService, (LPVOID*)&pClientInterface); if (hRes == S_OK) { pClientInterface->Release(); } CoUninitialize(); return 0;
-
Arrg...mir fällt gerade noch auf, dass ihr bestimmt wissen möchtet, was ich für einen Fehler bekomme;-)? Hab ich total vergessen.
Nach dem Aufruf von CoCreateInstance steht in hRes "REGDB_E_CLASSNOTREG Klasse nicht registriert"
-
Mit welchem Target ist die DLL gebaut (AnyCPU, x86 oder x64)? Und ist das Client-Programm 32 oder 64 Bit?
Versuch mal die DLL mit x86 zu bauen (und registrieren) und aus dem 32 Bit C++ Programm raus zu verwenden. Dann wüsstest du zumindest mal ob es ein "bittigkeits" Problem ist oder nicht.
-
Hallo hustbaer,
ein Blick mit ILSpy zeigt, dass die DLL's mit AnyCPU kompiliert wurden und 64Bit bevorzugen. Mein Anwendung habe ich deshalb auch mal in beide Richtungen kompiliert. Allerdings bekomme ich den selben Fehler immer noch.
Ich kann die DLL's leider nicht selbst kompilieren, da sie aus einem dazugekauften Produkt kommen.
-
OK.
Hm.
Hast du mal probiert die Klasse über OleView zu instanzieren?"Object Classes" -> "All Objects" -> "EASY ClientService" (oder wie auch immer die genau heisst) -> Doppelklick.
Wenn du keine Fehlermeldung bekommst und der Eintrag danach Fett geschrieben ist, dann hat OleView es geschafft die Klasse zu instanzieren.Und natürlich kannst du mal probieren ob CLSCTX_ALL nen Unterschied macht. Ich verwende eigentlich kaum 'was anderes als CLSCTX_ALL. Weil's mir ja egal ist wo/wie die Klasse implementiert ist, ich will sie ja bloss verwenden können.
-
Hallo Hustbaer,
das schien die Lösung gewesen zu sein. Ich habe den OleViewer mal angeworfen und gesehen, dass diese Klasse auch gar nicht registriert ist. Die Fehlermeldung war also gar nicht mal so abwegig;-)
Es scheint so zu sein, dass ich den Umweg über ein anderes Interface gehen muss um das zu bekommen was ich möchte. Also so verstehe ich das jetzt hier. Bin nicht sonderlich fit was das Thema angeht.
Desweiteren habe ich die CLSCTX_ALL Empfehlung ebenfalls übernommen.
Ich denke mal ich bin jetzt schon mal ein ganz schönes Stückchen weiter;-)
Sollte nichts mehr sein, dann bedanke ich mich an dieser Stelle schon mal für die Hilfe und wünsche ein schönes Wochenende.
Gruß