Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063292
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类: C/C++

2009-11-06 10:01:47

   新建项目,选择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项目基础上,右击项目,点击添加-新建项,选择代码下的模块新建文件。在新生成的文件中增加下面一行:
 

EXPORTS fnMy09DllDemo


    编译生成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;

}


直接运行得到结果。
阅读(2156) | 评论(0) | 转发(0) |
0

上一篇:2009国际工业博览会

下一篇:vs2010新特性

给主人留下些什么吧!~~