[转载]Win32 Dll编程详解

本文详细介绍了在Windows环境下如何通过不同方式从DLL中导出函数,并展示了如何调用这些函数,包括通过动态和静态链接的方式。文章还提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 

/*此函数通过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,"?add3@@YAHHH@Z");
  //或者: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,"_add5@8");

 

以上是动态加载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); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值