美文网首页
DLL导出函数

DLL导出函数

作者: 7bfedbe4863a | 来源:发表于2018-01-07 18:53 被阅读0次

    在函数声明前加__declspec(...)

    -声明时:

    extern "C"{
    #ifdef _DLL_SAMPLE
    #define DLL_SAMPLE_API __declspec(dllexport)
    #else
    #define DLL_SAMPLE_API __declspec(dllimport)
    #endif
    
        int a = 255;
        DLL_SAMPLE_API void TestDll(int);
    
    #undef  DLL_SAMPLE_API
    }
    

    -调用时:(调用方法可以参照前面的DLL链接)

      typedef void (*Test)(int);
      HINSTANCE hInstLib = LoadLibrary(_T("..\\debug\\DLLTeat.dll"));
       if (hInstLib == NULL)
      {
        return -1;
      }
       Test _Test;
      _Test = (Test)GetProcAddress(hInstLib,"TestDll");
      if (_Test==NULL)
      {
        return -1;
      }
      _Test(a);
      ......
    
    采用模块定义(.def)文件声明

    -在创建的DLL头文件中声明函数:

    #ifndef _DLLTEST_H_
    #define _DLLTEST_H_
    
    extern "C"{
        int __stdcall Add(int a,int b);
        int Sub(int a,int b); 
    }
    
    #endif
    

    -创建一个.def文件(VS2008创建时会自动生成第一行的内容)

     ;说明.def文件对应的DLL
    LIBRARY "DLLTestDef" 
    EXPORTS                  
    Add @1                         
    Sub @2
    
    • .def文件的内容解析
      --LIBRARY "DLLTestDef" ==》 说明.def文件对应的DLL,可以更改名字,不影响使用结果。
      --EXPORTS ==》这一句之后列出要导出的函数的名称
      --Add @1 ==》函数名 @n,其中n表示要导出的函数的序号
      --.def文件中的注释由每个注释行开始处的 ; 指定,且注释不能和语句共用一行

    -调用时:

        //头文件Windows.h 和iostream
        typedef int (__stdcall *Func1)(int,int);
        typedef int (*Func2)(int,int);
    
        HINSTANCE hInstLib = LoadLibrary(_T("..\\debug\\DLLTestDef.dll"));
        if(hInstLib == NULL)
        {
            cout<<"Find DLL Error!"<<endl;
            return 0;
        }
    
        Func1 func1;
        Func2 func2;
    
        func1 = (Func1)GetProcAddress(hInstLib,MAKEINTRESOURCEA(1));
        func2 = (Func2)GetProcAddress(hInstLib,MAKEINTRESOURCEA(2));
        
        if (func1 == NULL)
        {
            cout<<"Find Func1 Error!"<<endl;
        }
    
        if (func2 == NULL)
        {
            cout<<"Find Func2 Error!"<<endl;
        }
    
        cout<<func1(3,1)<<endl;
        cout<<func2(3,1)<<endl;
    
    使用__declspec 和 .def 的区别(在VS2008里)
    在DLL中使用extern "C"
    • 使用__declspec时,DLL中定义的函数如果加了 __stdcall ,在调用时会找不到函数;普通函数找到 _函数名
    • 使用 .def 时,DLL中定义的函数如果加了 __stdcall ,在调用时找到的函数结果为 _函数名@n;普通函数找到 _函数名
    • n是与参数有关。比如参数为两个int时,n为8;一个int时,n为4。
    • 如果.def文件中的函数不完整,那么在调用相应的GetProcAddress函数时,找不到函数的地址。
    在DLL中不使用extern "C"
    • 用.def的方式,调用函数结果为函数名 (参数列表)
    • 用__declspec的方式,调用GetProcAddress会找不到对应的函数

    相关文章

      网友评论

          本文标题:DLL导出函数

          本文链接:https://www.haomeiwen.com/subject/zkjmnxtx.html