为什么GetProcAddress()不工作?

我有相当新手到DLL编程。

我创build了一个DLL项目,

在DLL项目SimpleH.h

 namespace ME{ class base { public: static __declspec(dllexport) void Hello(); }; } __declspec(dllexport) void HelloWorld(); 

DLL.cpp

 #include "stdafx.h" #include <iostream> #include "SimpleH.h" using namespace std; namespace ME { void base::Hello() { cout << "Hello World\n"; } } void HelloWorld() { cout << "Hello I am world\n"; } 

我创build了一个.exe

Main.exe

  #include "stdafx.h" #include <stdlib.h> #include <Windows.h> #include <iostream> using namespace std; typedef void (*FunctionFunc)(); typedef void (*FunctionAno)(); int _tmain(int argc, _TCHAR* argv[]) { FunctionFunc _FunctionFunc; FunctionAno _FunctionAno; HINSTANCE hInstLibrary = LoadLibrary(L"MyDLL.dll"); if(hInstLibrary) { /*Problem Happens here*/ _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Hello"); _FunctionAno = (FunctionFunc)GetProcAddress(hInstLibrary, "HelloWorld"); /**/ if(_FunctionFunc) { _FunctionFunc(); } if(_FunctionAno) { _FunctionAno(); } DWORD error = ::GetLastError(); if (error) { LPVOID lpMsgBuf; LPVOID lpDisplayBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); } } FreeLibrary(hInstLibrary); system("pause"); return 0; } 

hInstance正在更新。 但是GetProcAddress()没有得到更新。 请帮帮我。 哪里出问题了?

导出的函数具有“装饰名称”。 使用DUMPBIN来查看它们。

DUMPBIN / EXPORTS Your.dll

您的函数和方法名称根据Visual C ++规则进行了修改 。

如果DUMPBIN /EXPORTS MyDLL.dll使用DUMPBIN /EXPORTS MyDLL.dll ,则会读取一些标识符名称,如:

  1 0 00001000 ?Hello@base@ME@@SAXXZ 2 1 00001020 ?HelloWorld@@YAXXZ 

因此,例如, HelloWorld实际上是以?HelloWorld@@YAXXZ 。 所以GetProcAddress()找不到原始标识符。 使用extern "C"来避免HelloWorld上的名称变形:

 extern "C" __declspec(dllexport) void HelloWorld(); 

有关从DLL中导出C ++类的正确方法的更多详细信息,请参阅本文的CodeProject文章 。