从网上搜的,希望对你有用!!!
我在Visual C++ 2003中,建立了一个Win32 DLL项目名叫DllTest2,在“应用程序设置”中选定了“导出符号”,然后在VC自动生成的代码中,有DllTest2.h:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
//宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLTEST2_EXPORTS
// 符号编译的。在使用此 DLL 的
//任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLLTEST2_API 函数视为是从此 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLLTEST2_EXPORTS
#define DLLTEST2_API __declspec(dllexport)
#else
#define DLLTEST2_API __declspec(dllimport)
#endif
// 此类是从 DllTest2.dll 导出的
class DLLTEST2_API CDllTest2 {
public:
CDllTest2(void);
// TODO: 在此添加您的方法。
};
extern DLLTEST2_API int nDllTest2;
DLLTEST2_API int fnDllTest2(void);
有DllTest2.cpp:
// DllTest2.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#include "DllTest2.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// 这是导出变量的一个示例
DLLTEST2_API int nDllTest2=0;
// 这是导出函数的一个示例。
DLLTEST2_API int fnDllTest2(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 DllTest2.h
CDllTest2::CDllTest2()
{
return;
}
就这样编译后得到一些文件,然后建立一个Win32应用程序,想在代码中调用fnDllTest2,该怎样调用呢?
在网上找,找到两个代码片段:
第一个:
HMODULE hModule;
FARPROC lpFunc;
hModule=LoadLibrary("DllTest2.DLL");//调试时hModule为0x10000000
if(hModule)
lpFunc=GetProcAddress(hModule,"fnDllTest2");
if(lpFunc != (FARPROC)NULL))//运行时lpFunc始终为0
a = (*lpFunc)();
FreeLibrary(hModule);
第二个:
HMODULE hModule;
typedef int(CALLBACK* fnGetNumber)(void);
fnGetNumber GetNumber;
hModule = LoadLibrary("DllTest2.dll");//调试时hModule为0x10000000
GetNumber =(fnGetNumber)GetProcAddress(hModule,"fnDllTest2");
if(GetNumber)//运行时GetNumber始终为0
a = GetNumber();
FreeLibrary(hModule);
因为lpFunc,GetNumber为0(hModule都不为0,为什么他为0呢),所以无法调用函数fnDllTest2。
这两个代码段有没有错呢,还是它们不适合用来调用VC++2003自动生成的Dll。
怎样在Win32程序中调用DLL中的函数呢,就调用那个上面的fnDllTest2,如果包含DllTest2.h,附加DllTest2.lib就可以调用,不过这样一来,就不用LoadLibrary,GetProcAddress都解决了,可不可以不包含DllTest2.h,不附加DllTest2.lib,调用fnDllTest2呢