新建项目,选择Win32项目,工程名:09DllDemo 确定后,选择应用程序设置, 应用程序类型选择DLL(D),附加选项上选择 导出符号(X)(便于学习)。单击完成,完成工程创建。
代码部分可以不用修改,其中包含例子,我们就以例子为基础,看使用;
1. 装载期加载
新建一个09ImportDemo的Win32控制台工程,将刚刚编译生成的09DllDemo.h, 09DllDemo.lib, 09DllDemo.dll 3个文件拷贝到09ImportDemo目录下。
加入下面的语句:
//lib编译,dll运行时连接
#include "09DllDemo.h" #include <iostream> using namespace std;
#pragma comment(lib,"09DllDemo")
void main() { int a =fnMy09DllDemo(); cout<<a<<endl; }
|
注意,在项目下的属性中,选择配置属性-连接器-输入-附加依赖项,增加09DllDemo.lib;编译后,生成代码,可以直接执行得到结果。注意,09DllDemo.h, 09DllDemo.lib, 09DllDemo.dll 3个文件中,lib/h用于编译链接,dll用于运行时使用。
2. 动态运行加载;
在刚刚的09DllDemo项目基础上,右击项目,点击添加-新建项,选择代码下的模块新建文件。在新生成的文件中增加下面一行:
编译生成09DllDemo.dll文件,并将文件拷贝到09ImportDemo目录下。修改09ImportDemo项目如下:
#include <windows.h> #include <iostream> using namespace std; //定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main() { FunctionFunc _FunctionFunc; //加载目标Dll
HMODULE hModule = ::LoadLibrary(TEXT("09DllDemo.dll")); if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{ ::FreeLibrary(hModule); } //取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress(hModule,"fnMy09DllDemo"); if (_FunctionFunc==NULL) { ::FreeLibrary(hModule); } int a =_FunctionFunc(); cout<< a<<endl; ::FreeLibrary(hModule); cin.get(); return 1;
}
|
直接运行得到结果。
阅读(2185) | 评论(0) | 转发(0) |