从网上搜的,希望对你有用!!!
我在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呢