我对DLL编程非常新手。
我创建了一个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";
}
我创建了.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()
没有得到更新。
请帮我。
哪里出错了?
答案 0 :(得分:3)
导出的函数具有“装饰名称”。使用DUMPBIN查看它们。
DUMPBIN / EXPORTS Your.dll
答案 1 :(得分:1)
您的函数和方法名称为mangled according to Visual C++ rules。
如果从命令行使用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 ++类的正确方法的更多详细信息,请参见this CodeProject article。