• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

Win32 Dll编程详解

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 186次 | 进入软件测试论坛讨论

领测软件测试网

 

/*此函数通过DEF文件导出,不会发生名字改编*/
int add1(int a,int b) 
{
   return a+b;
}

 

/*此函数通过DEF文件导出,不会发生名字改编
  此函数的调用方式为_stdcall
*/
int __stdcall add2(int a,int b)
{
   return a+b;
}

 


/*此函数通过关键字__declspec(dllexport)导出,会发生函数名的变化*/
__declspec(dllexport)  int add3(int a,int b)
{
   return a+b;
}

 


/*此函数通过关键字__declspec(dllexport)导出,但由于使用了
  extern "C",所以不会发生函数名的变化*/
extern "C" __declspec(dllexport)  int add4(int a,int b)
{
   return a+b;
}

 


/*此函数通过关键字__declspec(dllexport)导出,尽管使用了extern "C",
  但是函数的调用方式改为了__stdcall,所以还是会发生函数名改编*/
extern "C" __declspec(dllexport)  int __stdcall add5(int a,int b)
{
   return a+b;
}

def文件:

LIBRARY Dll2

EXPORTS
   add1
   add2

查看该dll的导出函数:

 

调用方法:

void CDllTestDlg::OnAdd1()
{
/*----------------动态加载动态连接库----------------------*/

 HINSTANCE hInst=::LoadLibrary("Dll2.dll");
 if(hInst)
 {
    typedef int (*ADD)(int,int); //定义一个函数指针类型
    ADD pAdd=(ADD)::GetProcAddress(hInst,"add1");
    if(pAdd)
    {
       CString str;
       str.Format("5+3=%d",pAdd(5,3));
       MessageBox(str);
    }

       ::FreeLibrary(hInst);
 }
}

第2个导出函数的调用:
  typedef int (__stdcall *ADD)(int,int); //定义一个函数指针类型
  ADD pAdd=(ADD)::GetProcAddress(hInst,"add2");

第3个导出函数的调用:
  typedef int (*ADD)(int,int); //定义一个函数指针类型
  ADD pAdd=(ADD)::GetProcAddress(hInst,"");
  //或者:ADD pAdd=(ADD)::GetProcAddress(hInst,MAKEINTRESOURCE(3));

第4个导出函数的调用:
  typedef int (*ADD)(int,int); //定义一个函数指针类型
  ADD pAdd=(ADD)::GetProcAddress(hInst,"add4");

第5个导出函数的调用:
  typedef int (__stdcall *ADD)(int,int); //定义一个函数指针类型
  ADD pAdd=(ADD)::GetProcAddress(hInst,"");

 

以上是动态加载dll. 以下是静态加载的方法:

/*------------------声明导入函数的方法----------------*/
#pragma comment(lib,"Dll1.lib")

/*
方法一:直接写出dll中函数的声明
  int add(int a,int b); 
  int sub(int a,int b);

方法二:通过关键字__declspec(dllimport)这种方法能够编译出效率更高的代码
  __declspec(dllimport)  int add(int a,int b);
  __declspec(dllimport)  int sub(int a,int b);

方法三:直接包含dll的头文件 */
#include "Dll1.h"
/*---------------------------------------------------------*/

然后直接调用dll中的函数:
void CDllTestDlg::OnAdd()
{
   CString str;
   str.Format("1+2=%d",add(1,2));
   MessageBox(str); 
}

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网