2.建立动态链接库DLL
建立在win32平台下dll的创建,创建win32项目,之后选择dll。创建过程如下图。
创建头文件lib.h及lib.cpp。源码如下:
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport) add(int, int);
#endif
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
同样,生成后可以在Debug文件中看到*.dll文件。之后再该“解决方案”下,即VC6.0中所说的同一工作区中,创建新项目libCall工程,工程仅包含一个main.cpp文件,演示了如何将静态链接库调用的方法,源码如下:
#include <stdio.h>
#include <Windows.h>
typedef int(*lpAddFun)(int ,int );//宏定义函数指针类型
int main(int arge,char *argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll = LoadLibrary("..\\dllTest\\Debug\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"add");
if (addFun != NULL)
{
int result = addFun(2,3);
printf("2+3=%d",result);
}
FreeLibrary(hDll);
}
return 0;
}
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换。
首先,LoadLibrary实际是LoadLibraryW进行的调用,因为在VS2005以后,编码方式默认为Unicode,部分函数在使用时默认调用Unicode方式。所以要使用LPCWSTR进行调用,将加上强制转换后,运行仍不正常。LoadLibraryA和LoadLibraryW分别对应ASCII和宽字节版本。LoadLibrary就等同于LoadLibraryA或LoadLibraryW,看其定义:
#ifdef _Unicode
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif
但是使用LoadLibraryW没有进行正确输出,应该是将字符串判断为ANSI格式了,改为
hDll = LoadLibraryA(LPCSTR("..\\dllTest\\Debug\\dllTest.dll"))后,程序正常。注意:此前dllTest项目要进行编译后,才会生成*.dll文件。生成后可在Debug文件中看到有dllTest.lib存在.之后编译,可以正常运行,输出结果。
关于extern "C" int __declspec(dllexport)
的解释见文章点击打开链接
当然,也可以不使用该种形式,只在lib.h中正常声明add函数,同时在dllTest下创建一个新的lib.def文件,内容如下:
LIBRARY dllTest
EXPORTS
add @1
同时在
addFun = (lpAddFun)GetProcAddress(hDll,"add");//将第二个参数改为MAKEINTERSOURCEA(),参数为@n的值
addFun = (lpAddFun)GetProcAddress(hDll,MAKEINTRESOURCEA(1));