GetProcAddress kann nicht finden, meine Funktionen
Machte ich eine DLL mit einer Funktion namens "render()" und ich möchte, um es zu laden dynamisch an meiner Bewerbung, aber GetProcAddress kann es nicht finden. Hier ist die DLL .h:
#ifdef D3D_API_EXPORTS
#define D3D_API_API __declspec(dllexport)
#else
#define D3D_API_API __declspec(dllimport)
#endif
D3D_API_API void render();
Und hier die DLL .cpp:
#include "stdafx.h"
#include "D3D_API.h"
#include <iostream>
D3D_API_API void render()
{
std::cout << "method called." << std::endl;
}
Hier ist die Anwendung, die versucht, diese Funktion zu verwenden:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE myDLL = LoadLibrary( L"D3D_API.dll" );
if (myDLL == NULL) {
std::cerr << "Loading of D3D_API.dll failed!" << std::endl;
}
typedef void (WINAPI *render_t)();
render_t render = (render_t)GetProcAddress( myDLL, "render" );
if (render == NULL) {
std::cerr << "render() not found in .dll!" << std::endl;
}
return 0;
}
Mein Ziel ist es eine 3D-engine unterstützt sowohl D3D und OpenGL durch Ihre eigenen .DLLs mit einem einheitlichen API. Ich schaute auf die .dll im Editor, und es war ein string "Rendern".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion, die Sie exportieren, wird behandelt, als eine C++ - Funktion (wegen *.cpp-Datei-Erweiterung) und so C++ die name manglings wird verwendet, um schmücken Sie den Namen der exportierten Funktion. Wenn Sie die Dependency Walker tool von Microsoft, um zu überprüfen Ihre erstellten DLL sehen Sie die Funktionen der vollständigen Namen.
Können Sie entweder verziert, die Namen in der import-code oder die Kraft der compiler exportieren Sie Ihre Funktion im C-Stil, das heißt, in seiner schmucklosen form, die Ihren aktuellen import-code erwartet.
Kann man sagen, dass der compiler fügt
extern "C"
auf Ihre Funktionen Signatur. So etwas wie dieses:Nun Ihre import-code sollte funktionieren, da expexted.
GetProcAddress(myDLL, "??0MyObject@my_name_space@@QAE@XZ");
und der Rückgabewert istNULL
. Sind Sie sicher, dass das funktionieren sollte?