作者:jfy1970
QQ:953491278 电子邮件:zhiqiangwang58@sohu.com
在VC++6.0中new一个Win32 Dynamic-Link Library工程mylib,注意不要选择MFC AppWizard(dll)。如下图所示:
在建立的工程中添加mylib.h和mylib.cpp文件,源代码如下:
//mylib.h
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x,int y);
#endif
//mylib.cpp
#include "mylib.h"
int add(int x,int y)
{
return x+y;
}
我们建立一个Win32 Console Application应用程序dllCallExample,它调用mylib中的函数add。如下图所示:
源代码如下:
//dllCallExample.cpp
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int,int); //宏定义函数指针
int main(int argc,char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll=LoadLibrary("Debug//mylib.dll");
if(hDll==NULL) //测试句柄调用是否成功。
printf("error!/n");
else
printf("Succeed!/n");
if(hDll!=NULL)
{
addFun=(lpAddFun)GetProcAddress(hDll,"add");
if(addFun!=NULL)
{
int result=addFun(2,3);
printf("2+3=%d",result);
getchar();
}
FreeLibrary(hDll);
}
return 0;
}
运行该程序,程序成功执行,得到的结果如下:
说明:
mylib工程中,在mylib.h中,对函数add的声明前面添加了__declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。
dllCallExample工程中,在dllCallExample.cpp文件中,要注意几个问题:
首先,语句typedef int(*lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;
其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;
再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;
最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。
本方案在Windows XP SP2,VC++6.0下调试通过。如果需要源代码,请与我联系。