Voraussetzugen für das Registrieren einer DLL
-
Hallo,
ich brauche in unserer ERP Software eine externe Komponente. Das ganz sollte aber performant sein. Ich habe mich daswegen für C++ entschieden. Bisher habe ich alle externen Funktionen usw. in C# in den VS2008 entwickelt und da kann ich beim kompilieren direkt sagen, dass die DLL direkt für COM Interop registriert werden soll.
Diese Option gibt es aber nicht wenn ich über den Win32 Anwendungs Assistenten eine DLL erstelle.
Kann mir vielleicht jemand ein minimal Model einer DLL zukommen lassen dieregistriert werden kann? Ich weiß nicht so ganz wo ich anfangen soll...
-
Das ist nicht C++.
Soll ich das nach WinAPI, C++/CLI oder C# verschieben? Oder nochwoanders hin?
-
C# auf keinen Fall. Da komme ich ja her und hätte das Problem auch nicht.
-
Mach einfach eine COM DLL, sowas gibts doch bei der Projektauswahl, oder?
Edit:
@volkard: ich würds nach Visual C++ / MFC verschieben - ist das passendste, wenn auch nicht perfekt.
-
Okay,
ich habe eine MFC DLL erstellt. Nun stehe ich vor dem Problem, dass ich eigentlich gar nicht so genau weiß wo ich meinen Code einfügen soll. Im Prinzip reicht es ja erstmal, wenn ich nach außen hin eine Funktion zum Testen sehen kann..Das ist die Haupt *.cpp
// STRPerfTest.cpp : Definiert die Initialisierungsroutinen für die DLL. // #include "stdafx.h" #include "STRPerfTest.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CSTRPerfTestApp BEGIN_MESSAGE_MAP(CSTRPerfTestApp, CWinApp) END_MESSAGE_MAP() // CSTRPerfTestApp-Erstellung CSTRPerfTestApp::CSTRPerfTestApp() { // TODO: Hier Code zur Konstruktion einfügen. // Alle wichtigen Initialisierungen in InitInstance positionieren. } // Das einzige CSTRPerfTestApp-Objekt CSTRPerfTestApp theApp; const GUID CDECL BASED_CODE _tlid = { 0x7FFB6491, 0xE048, 0x4985, { 0x97, 0xB1, 0xD3, 0x5C, 0x71, 0xE6, 0x67, 0x48 } }; const WORD _wVerMajor = 1; const WORD _wVerMinor = 0; // CSTRPerfTestApp-Initialisierung BOOL CSTRPerfTestApp::InitInstance() { CWinApp::InitInstance(); // Alle OLE-Server(-factorys) als aktiv registrieren. Dies aktiviert die // OLE-Bibliotheken, um Objekte von anderen Anwendungen zu erstellen. COleObjectFactory::RegisterAll(); return TRUE; } // DllGetClassObject - Gibt eine Klassenfactory zurück. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return AfxDllGetClassObject(rclsid, riid, ppv); } // DllCanUnloadNow - Ermöglicht COM, eine DLL zu entladen. STDAPI DllCanUnloadNow(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return AfxDllCanUnloadNow(); } // DllRegisterServer - Fügt der Systemregistrierung Einträge hinzu. STDAPI DllRegisterServer(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid)) return SELFREG_E_TYPELIB; if (!COleObjectFactory::UpdateRegistryAll()) return SELFREG_E_CLASS; return S_OK; } // DllUnregisterServer - Entfernt Einträge aus der Systemregistrierung. STDAPI DllUnregisterServer(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor)) return SELFREG_E_TYPELIB; if (!COleObjectFactory::UpdateRegistryAll(FALSE)) return SELFREG_E_CLASS; return S_OK; }
-
secondsun schrieb:
Bisher habe ich alle externen Funktionen usw. in C# in den VS2008 entwickelt und da kann ich beim kompilieren direkt sagen, dass die DLL direkt für COM Interop registriert werden soll.
Diese Option gibt es aber nicht wenn ich über den Win32 Anwendungs Assistenten eine DLL erstelle.
-
Du sollst keine MFC DLL erstellen, sondern eine COM DLL, einen COM Server.
-
Ok, das ist das was ich eigentlich bräuchte aber...
Scheiße, wieso geht das denn nicht noch komplizierter?!
Da kann ich schon fast übelegen, das mit Assembler zu machen..Ich glaube ich bleibe bei C#. Das ist mir sonst zu doof...
-
Ich verstehe Dein Problem nicht.
Eine DLL ist nichts anderes als eine besondere Bibliothek mit eigenen Funktionen. Die Einbindung ist Angelegenheit des Compilers und des Linkers.
Unterschiede gibt es nur, ob Konsole oder Windows. Wie man das macht, sollte in den Beschreibungen des verwendeten Compilers ausreichend beschrieben sein. C++ hat damit keine grossen Schwierigkeiten!