将dll文件放到目录下面。新建并添加main.c
#include
#include
#include
typedef int (*MYPROC)(int, int);
int main()
{
HINSTANCE LibHandle;
MYPROC ProcAdd,ProcSub;
char dllbuf[] = "dll.dll";//dll的路径
char sysbuf[] = "add"; /*过程名*/
char sysbuf1[] = "sub";
LibHandle = LoadLibrary(dllbuf); /*载入dll*/
ProcAdd = (MYPROC)GetProcAddress(LibHandle, sysbuf); /*获取函数sysbuf的地址*/
ProcSub = (MYPROC)GetProcAddress(LibHandle, sysbuf1);
printf("%d\n",(ProcAdd)(3,6));
printf("%d\n",(ProcSub)(3,6));
}
动态调用dll
dll文件的编写没有变化。(有dll4.def文件防止发生名字改编)
调用如下:
//动态调用
HINSTANCE hIst;
hIst = LoadLibrary("dll4.dll");
typedef int (_stdcall *ADDPROC)(int a, int b);
ADDPROC Add = (ADDPROC)GetProcAddress(hIst, "add");
if(!Add)
{
AfxMessageBox("get address error.");
return;
}
int iRet = Add(5, 10);
CString strMsg;
strMsg.Format("%d", iRet);
AfxMessageBox(strMsg);
hIst = LoadLibrary("dll4.dll"); 是加载动态链接库
typedef int (_stdcall *ADDPROC)(int a, int b); 定义一个和dll导出函数一至的原型函数
ADDPROC Add = (ADDPROC)GetProcAddress(hIst, "add"); 根据函数名,得到函数地址
注意:因为dll改变了调用约定,所以在声明函数原型时,也加上了_stdcall ,否则应该如下:
typedef int (*ADDPROC)(int a, int b);
注意:如果dll导出函数发生了名字改编,再用dll中函数的名字则会出错。要用dumpbin中看到的名字。或者用
ADDPROC Add = (ADDPROC)GetProcAddress(hIst, MAKEINTRESOURCE(1));
根据序号来取得函数地址,但这种方法不太好。
在不需要使用动态链接库时,可以调用FreeLibrary(hIst);来释放动态链接库
所以在以后dll的使用中可以:
a. 使用def文件防止名字改编
b. 使用动态调用