[转载]Win32 Dll编程详解


 

/*此函数通过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); 
}
posted @ 2007-04-11 17:33 我淋着雨 阅读(...) 评论(...) 编辑 收藏