DLL Problem
-
Morgen,
ich habe einige Funktionen einer DLL exportiert. Jedoch muss ich bei GetProcAddress komische Funktionsnamen eingeben, damit ich diese nutzen kann.
z.B. ?Function@@XZAZY... Weiß jemand von euch woran dass liegen könnte?
-
Hab das irgendwie grad nur noch sehr wage in Erinnerung, aber es gab auch eine Möglichkeit eine (.DEF???) Datei mit den Funktions-Namen dem Projekt hinzuzufügen, damit diese nicht durch Name-Extension (hieß das so) verändert werden.
Vielleicht hilft dir ja das ein wenig:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-284764.html
-
extern "C" { }ist die lösung, ausser du möchtest klassen exportieren dann solltest du ein
pluginsystem schreiben.
http://www.cpp-tutor.de/cpp/le07/le07_03_d1.htm
-
@miller_m, extern "C" hat leider nicht funktioniert.
Ich poste jetzt einfach mal meinen Code. Ich sehe den Fehler bzw. das Problem nicht.Testanwendung
#include <windows.h> #include <stdlib.h> #include <stdio.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; int iRes = 0; HMODULE hModule = LoadLibrary( "dllbase.dll" ); if ( hModule ) { // Funktioniert nicht FARPROC proc = GetProcAddress( hModule, "FirstDLLFunct" ); // Funktioniert komischer Weise FARPROC proc = GetProcAddress( hModule, "?FirstDLLFunct@@YGHXZ" ); if ( proc ) iRes = proc(); FreeLibrary( hModule ); }; while ( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }; return 0; };DLL.cpp
#include "dllbase.hpp" HINSTANCE hInst; extern "C" __declspec(dllexport) int __stdcall FirstDLLFunct( void ) { char cName[MAX_PATH]; if ( GetModuleFileName( hInst, cName, sizeof( cName ) ) ) { MessageBox( NULL, cName, NULL, MB_OK ); }; return 100; }; BOOL WINAPI DllMain( HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved ) { hInst = hModule; switch ( dwReason ) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; };DLL.hpp
#ifndef DLLBASE_HPP #define DLLBASE_HPP #include <windows.h> extern "C" __declspec(dllexport) int __stdcall FirstDLLFunct( void ); BOOL WINAPI DllMain( HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved ); #endif //DLLBASE_HPP
-
ich kann es gerade nicht test aber ich glaub das __stdcall haut es wieder
zusammen. bin mir aber nicht sicher.
probier malextern "C" __declspec(dllexport) int FirstDLLFunct() { //.. };welchen compiler verwendest du? afaik verwendet vc normalerweise __cdecl
könnte auch nen problem sein.wenn du sowieso dynamisch auf die dll zurückgreifst kannst du dir die
definition der funktion im header bzw. sogar den ganzen header schenken.wichtiges tool zum dll programmieren
http://www.dependencywalker.com/
-
@miller_m, der Fehler lag wirklich am __stdcall. Darauf wäre ich warscheinlich als letztes gekommen. Danke.
-
...ne *.def-Datei kann da helfen:
LIBRARY NameDerDLL EXPORTS FunktionInDerDLL EineWeitereFunktion...quasi Funktionsnamen ohne Parameter auflisten. Die Datei dann dem Projekt hinzufügen und neu-compilen.
-
funktioniert aber nicht mit allen compilern, migw kann es afaik nicht oder ich hab es noch nicht hinbekommen
