一、生成Win32 DLL
(1)创建Win32 DLL工程
File->New->Projects->Win32 Dynamic Link Library,在"Project name" 中输入MyDll->OK->An empty DLL project->Finish->OK
(2)添加头文件mydll.h
File->new->Files->C/C++ Header File,输入文件名为:mydll.h->OK
mydll.h:
extern "C" _declspec(dllexport) int Add(int x,int y);
(3)添加源文件mydll.cpp
File->new->Files->C/C++ Source File,输入文件名为:mydll->OK
mydll.cpp:
#include<stdio.h>
#include "mydll.h"
int Add(int x,int y)
{
return x+y;
}
(4)编译,连接后,在Debug目录生成MyDll.dll,MyDll.lib
注:可使用Visual C++ 6.0自带的Depends工具,打开MyDll.dll,则可看到定义的导出函数.
二、调用Win32 DLL
方法一:隐式调用
(1)File->New->Projects->Win32 Console Application,在"Project name" 中输入TestMyDll,OK,An empty project->Finish->OK
将MyDll.dll,MyDll.lib拷贝到TestMyDll目录下。
(2)File->new->Files->C/C++ Source File,输入文件名为:testmydll->OK
testmydll.cpp:
#include<stdio.h>
#pragma comment(lib,"MyDll.lib")
extern "C" _declspec(dllimport) int Add(int x,int y);
void main()
{
int i=Add(1,2);
printf("1+2=%d/n",i);
}
注:也可将#pragma comment(lib,"MyDll.lib")注释掉,并在Project->Settings->Link>Object/library modules 中加入MyDll.lib
方法二:显示调用
只须将MyDll.dll拷贝到TestMyDll目录下。
#include<stdio.h>
#include<windows.h>
typedef int (*lpAdd)(int x,int y);
void main()
{
int i=0;
HINSTANCE hinstance=LoadLibrary("MyDll.dll");
lpAdd add=(lpAdd)GetProcAddress(hinstance,"Add");
i=add(1,2);
FreeLibrary(hinstance);
printf("1+2=%d/n",i);
}
注:
1.LoadLibrary:加载可执行模块
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);
如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:
1. 包含EXE文件的目录,
2. 进程的当前工作目录,
3. Windows系统目录,
4. Windows目录,
5. 列在Path环境变量中的一系列目录。
2.GetProcAddress:返回指定导出Dll函数的地址
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);