当前位置:首页 > c++ > 正文内容

C++从dll导出lib

xuwenyan3年前 (2021-03-03)c++438

一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:

DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
 二、将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
EXAMPLE:VideoDeCoder.DEF 文件内容如下Dump of file VideoDeCoder.dll                                 
                                                                      
        File Type: DLL                                                
                                                                      
          Section contains the following exports for VideoDeCoder.dll 
                                                                      
                   0 characteristics                                  
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
                0.00 version                                          
                   1 ordinal base                                     
                  11 number of functions                              
                  11 number of names                                  
                                                                      
            ordinal hint RVA      name                                
                                                                      
                  1    0 00010F60 _TM_ClearDecoderBuff@4              
                  2    1 00010E80 _TM_CloseDecoder@4                  
                  3    2 00010F00 _TM_DecodePicture@4                 
                  4    3 00010ED0 _TM_DecodePictureHeader@4           
                  5    4 00010FD0 _TM_GetFileEnd@4                    
                  6    5 00011030 _TM_GetUValue@4                     
                  7    6 00011060 _TM_GetVValue@4                     
                  8    7 00011000 _TM_GetYValue@4                     
                  9    8 00010E10 _TM_OpenDecoder@8                   
                 10    9 00010F30 _TM_ReturnType@4                    
                 11    A 00010F90 _TM_SetFileEnd@8                    
                                                                      
          Summary                                                     
                                                                      
                2000 .data                                            
                1000 .rdata                                           
                1000 .reloc                                           
               15000 .text
按照以下方法整理:
1)添加LIB说明 LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
DESCRIPTION "VideoDeCoder library" 
2)去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数 LIBRARY "VideoDeCoder"
DESCRIPTION "VideoDeCoder library"

EXPORTS
            ordinal hint RVA      name                         
                                                               
                  1    0 00010F60 TM_ClearDecoderBuff@4                              2    1 00010E80 _TM_CloseDecoder@4                              3    2 00010F00 _TM_DecodePicture@                              4    3 00010ED0 _TM_DecodePictureH                              5    4 00010FD0 _TM_GetFileEnd@4                                6    5 00011030 _TM_GetUValue@4                                 7    6 00011060 _TM_GetVValue@4                                 8    7 00011000 _TM_GetYValue@4                                 9    8 00010E10 _TM_OpenDecoder@8                              10    9 00010F30 _TM_ReturnType@4                               11    A 00010F90 _TM_SetFileEnd@8 3)将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号 形成 "导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和"). 最后形成.DEF文件如下: LIBRARY "VideoDeCoder"
  DESCRIPTION "VideoDeCoder library"

  EXPORTS
     
  TM_ClearDecoderBuff@4             @1   
  TM_CloseDecoder@4                 @2   
  TM_DecodePicture@4                @3   
  TM_DecodePictureHeader@4          @4   
  TM_GetFileEnd@4                   @5   
  TM_GetUValue@4                    @6   
  TM_GetVValue@4                    @7   
  TM_GetYValue@4                    @8   
  TM_OpenDecoder@8                  @9   
  TM_ReturnType@4                  @10   
  TM_SetFileEnd@8                  @11
 三、使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:LIB /DEF:VideoDeCoder.def /MACHINE:IX86
 四、接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错: error LNK2002:unresolved external symbol "functionname@nn" 提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 LIB,重新链接即可.

最后还有一句,要自动生成.h文件好象是不行的.因为dll里没有保存函数原型,需要反汇编并分析代码才知道每个函数的参数情况.

    文章作者:xuwenyan
    文章标题:C++从dll导出lib
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/375

    分享给朋友:

    “C++从dll导出lib” 的相关文章

    C++如何实现窗口全屏显示

    C++如何实现窗口全屏显示

    窗口全屏,直接上代码:void FullScreen(HWND hwnd) {   //去掉所有边框,解决虚拟机win10任务栏显示问题   DWORD style = ::GetWindowLo...

    C++实现win32窗口文件拖拽

    C++实现win32窗口文件拖拽

    如题,C++如何实现win32窗口文件拖拽,直接上代码 方法1:使用win32消息实现 此方法的弊端在于,无法过滤可以拖拽的文件,拖拽时显示的图标也默认的,无法像资源管理器那样自定义。实现步骤大致分为以下三步: 第一步:首先创建窗口时必须在exStyle加上WS_EX_ACCEP...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...

    c++函数模板参数类型限定

    c++函数模板参数类型限定

    函数模板函数模板可以实现对不同数据类型做统一操作,比如比较两个数据的大小:template<typename T> bool compare(T& a,T& b) {   return a...