似乎dll的导出函数要使用动态的方式调用,必须要接受一个参数,我原来的那个测试dll的代码如下
//dll001.dll
#include "stdafx.h"
HMODULE g_hModule;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HMODULE)hModule; // 保存模块句柄
break;
}
return FALSE;
}
void a()
{
::MessageBox(NULL,"test the dll !!!","notice",MB_OK|MB_ICONINFORMATION);
}
导出函数是新建了一个def文件,然后里面写入如下代码
a.def
EXPORTS
a
然后写了下面的exe测试程序
#include "stdafx.h"
#include "windows.h"
typedef void (*PFNEXPORTFUNC)(LPCTSTR);
int main(int argc, char* argv[])
{ // 加载DLL库
HMODULE hModule = ::LoadLibrary("dll001.dll");
if(hModule != NULL)
{
// 取得ExportFunc函数的地址
PFNEXPORTFUNC mExportFunc = (PFNEXPORTFUNC)::GetProcAddress(hModule, "a");
if(mExportFunc != NULL)
{
::MessageBox(NULL,"Load dll successful","Notice",MB_OK);
mExportFunc;
}
else
{
::MessageBox(NULL,"NO DLL","STOP",MB_OK);
}
// 卸载DLL库
::FreeLibrary (hModule);
}
return 0;
}
这样可以成功加载,但是就是没有办法调用dll的导出函数a,然后把dll程序更改成了下面的样子
#include "stdafx.h"
HMODULE g_hModule;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HMODULE)hModule; // 保存模块句柄
break;
}
return FALSE;
}
void a(LPCTSTR pszContent)
{
::MessageBox(NULL,"test the dll !!!","notice",MB_OK|MB_ICONINFORMATION);
}
将测试的exe更改成了下面的样子
#include "stdafx.h"
#include "windows.h"
typedef void (*PFNEXPORTFUNC)(LPCTSTR);
int main(int argc, char* argv[])
{ // 加载DLL库
HMODULE hModule = ::LoadLibrary("dll001.dll");
if(hModule != NULL)
{
// 取得ExportFunc函数的地址
PFNEXPORTFUNC mExportFunc = (PFNEXPORTFUNC)::GetProcAddress(hModule, "a");
if(mExportFunc != NULL)
{
::MessageBox(NULL,"Load dll successful","Notice",MB_OK);
mExportFunc("fdfd"); //里面的参数是随便写的
}
else
{
::MessageBox(NULL,"NO DLL","STOP",MB_OK);
}
// 卸载DLL库
::FreeLibrary (hModule);
}
return 0;
}
这样竟然能成功的调用,也不知道是为什么,真奇怪。
04.12.2007 16:01