二、动态方式调用DLL
动态调用这个DLL,就需要对这个class进行修改了。
首先,在DLLTest.cpp文件中增加一个全局函数,该函数可以返回这个class的一个实例,这样,客户端程序调用这个全局函数后,得到该class的实例,就可以调用该class的实例方法了。
extern "C" _declspec(dllexport) CDLLTest* GetInstance()
{
return new CDLLTest;
}
注:extern "C" 只是解决了c与c++编译器之间的兼容问题,如果需要和其他编译器之间兼容,可靠的办法还是增加一个.def文件,文件内容如下:
LIBRARY "DLLTest"
EXPORTS
GetInstance = GetInstance
这样就指定了DLL的函数导出后的名称仍然不变。
这样,客户端程序就可以通过该函数来获取class的一个实例了。如下:
先需要定义一个函数指针类型:
typedef CDllTestBase* (*pfGetInst)();
//注:CDllTestBase类后面会介绍。
HMOUDLE hMod = LoadLibrary( _T("DLLTest.DLL") );
if(hMod)
{
pfGetInst pfGetInstance = (pfGetInst)GetProcAddress("GetInstance");
if( p )
{
//通过基类指针指向派生类对象
CDllTestBase * pInst = pfGetInstance ();
if( NULL != pInst )
{
pInst->Add( 1,2);
}
if( NULL != pInst )
{
//释放对象
delete pInst;
}
}
}
当然,这里还是需要include这个DLL的头文件DLLTestBase.h,如果将之前所写的头文件DLLTest.h直接拷贝到客户端程序的当前目录下,并include进来的话,在编译连接时,是无法通过的,我们需要对这个头文件进行修改,首先增加一个.h 文件DLLTestBase.h,在这个文件中我们将需要在客户端程序中调用的函数都命名成纯虚函数,然后让CDLLTest类继承自CDLLTestBase类,DLLTestBase.h如下:
Class CDLLTestBase
{
Public:
Virtual ~CDLLTestBase(){};//虚析构函数,且为内联函数
Virtual int Add(int a, int b) = 0;
}
DLLTest.h修改后如下:
#include "DLLTestBase.h"
Class CDLLTest : public CDLLTestBase
{
Public:
CDLLTest();
~CDLLTest();
int Add(int a, int b);
};
注:这里的DLLTestBase需要提供一个虚析构函数,这样在客户端程序中就可以通过基类指针来释放派生类对象了。
这样,只需要将DLLTestBase.h拷贝到客户端程序的当前目录下,然后在客户端程序中#include"DLLTestBase.h",就可以如上面介绍一样在客户端程序中调用DLL里面的方法了。
希望本文所述对大家VC++程序设计有所帮助。
注:相关教程知识阅读请移步到C++教程频道。










