DLL转Lib

在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便使用同一个名字(具有不同的参数类型或者是不同的作用域)有多种不同的用法,而不会打破现有基于C的链接器,.这项技术通常被称为改编(Name Mangling)或者名称修饰(Name Decoration),许多C++编译器厂商选择了自己的名称修饰方案.

在VC++中,函数修饰名有编译类型(C或C++),函数名,类名,调用约定,返回类型,参数等多种因素决定.关于名称修饰的东西很多,下面仅仅简单的谈一下常用的C编译,C++编译函数名修饰
一.C编译时函数名修饰约定规则
(1)_stdcall调用约定在输出函数名前面加上一个下划线前缀,后面加上一个"@"符号和其参数字节数,格式
_functionname@number
(2)_cedecl调用约定仅在输出函数名称前加上一个下划线的前缀,格式为_functionname
(3)_fastcall调用约定在输出函数名前面加上一个"@",后面加上一个"@"和参数字节数,格式@functionname@number

二.C++编译时函数名修饰约定规则
(1)_stdcall调用约定以"?"标识函数名的开始,后面跟函数名;函数名后以"@@YG"标识参数表的开始,后跟参数表;参数表的第一项为该函数的返回值类型,其后一次为参数的数据类型,指针标识在其所指数据类型前;参数表后以"@Z"标识整个名字结束,如果该函数无参数,则以为"Z"标识结尾.其格式为: "
?functionname@@YG*****@Z"或者"?functionname@@YG*XZ"
(2)_cdecl调用约定同上面的_stdcall,只是参数表的开始由上面的@@YG变成了@@YA
(3)_fastcall调用约定规则同上_stdcall,只是参数表由"@@YG"变成了"@@YI"
--------------------------------------------------------------------------------------------------------------------------
从dll导出lib文件
一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:

DUMPBIN SkinH.dll /EXPORTS /OUT:SkinH.def

Dump of file G:\Programing\VC6.0\Test123\SkinH.dll

File Type: DLL

  Section contains the following exports for SkinH_VB6.dll

           0 characteristics
    4AAEFE79 time date stamp Tue Sep 15 10:39:53 2009
        0.00 version
           1 ordinal base
          23 number of functions
          23 number of names

    ordinal hint RVA      name

          1    0 00025FF0 SkinH_AdjustAero
          2    1 00025FC0 SkinH_AdjustHSV
          3    2 00025F00 SkinH_Attach
          4    3 00025F10 SkinH_AttachEx
          5    4 00025F30 SkinH_AttachExt
          6    5 00025F60 SkinH_AttachRes
          7    6 00025F90 SkinH_AttachResEx
          8    7 000260A0 SkinH_Detach
          9    8 000260B0 SkinH_DetachEx
         10    9 000260C0 SkinH_GetColor
         11    A 00026060 SkinH_LockUpdate
         12    B 00026080 SkinH_Map
         13    C 00026130 SkinH_NineBlt
         14    D 00025FE0 SkinH_SetAero
         15    E 000261D0 SkinH_SetBackColor
         16    F 00026160 SkinH_SetFont
         17   10 00026180 SkinH_SetFontEx
         18   11 000261F0 SkinH_SetForeColor
         19   12 00026030 SkinH_SetMenuAlpha
         20   13 00026100 SkinH_SetTitleMenuBar
         21   14 00026040 SkinH_SetWindowAlpha
         22   15 000260E0 SkinH_SetWindowMovable
         23   16 00026210 SkinH_VerifySign

  Summary

       1D000 .52PoJie
       39000 .Hmily

1)添加LIB说明 LIBRARY "SkinH"            ;DLL名称
DESCRIPTION "SkinH library" 
2)去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数
3)将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和"). 最后形成.DEF文件如下:

LIBRARY "SkinH"
DESCRIPTION "SkinH_VB6 library"
EXPORTS
SkinH_AdjustAero@0 @1
SkinH_AdjustHSV@0 @2
SkinH_Attach@0 @3
SkinH_AttachEx@8 @4
SkinH_AttachExt@0 @5
SkinH_AttachRes@0 @6
SkinH_AttachResEx@0 @7
SkinH_Detach@0 @8
SkinH_DetachEx@0 @9
SkinH_GetColor@0 @10
SkinH_LockUpdate@0 @11
SkinH_Map@0 @12
SkinH_NineBlt@0 @13
SkinH_SetAero@4 @14
SkinH_SetBackColor@0 @15
SkinH_SetFont@0 @16
SkinH_SetFontEx@0 @17
SkinH_SetForeColor@0 @18
SkinH_SetMenuAlpha@0 @19
SkinH_SetTitleMenuBar@0 @20
SkinH_SetWindowAlpha@8 @21
SkinH_SetWindowMovable@0 @22
SkinH_VerifySign@0 @23

当然 有的函数 我没有用的  我就全部给了0

4)使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:LIB /DEF:SkinH.def /MACHINE:IX86

5)接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错: error LNK2002:unresolved external symbol "functionname@nn" 提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 LIB,重新链接即可.

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

extern "C" BOOL WINAPI SkinH_AttachEx(LPCTSTR strSkin,LPCTSTR strPwd);
extern "C" BOOL WINAPI SkinH_SetWindowAlpha(HWND hWnd,DWORD nAlpha);
extern "C" BOOL WINAPI SkinH_SetAero(DWORD nEnable);
最后函数头添加声明 

就可以调用了 - -!

 

相关参考:

http://blog.sina.com.cn/s/blog_4c72efa6010092m5.html

http://blog.csdn.net/tingsking18/article/details/5394466

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WP8手机解锁时提示“请确保IPOVERUSBSVC服务正常运行”解决方法

如果你各种重启服务 卸载手机 重装驱动都试过了还不行,请看看你是否安装了Hyper-v或Vitualbox虚拟机,很有可能是虚拟交换机造成的。 我在网络连接属性里看到这个 把它卸载后,解锁成功。 解锁后记得重新安装卸载的那个网络服务转载于:https://…

Win32路径操作相关API

一.路径截断与合并 PathRemoveArgs 去除路径的参数 PathRemoveBackslash 去除路径最后的反斜杠 "\" PathAddBackslash 在路径最后加上反斜杠 "\" PathRemoveBlanks 去除路径前后的空格 PathAddExtension 在文件路径后面加上扩展名 PathRemoveExtension 去…

Openjudge-计算概论(A)-称体重

描述: 赵、钱、孙、李四个人中既有大人也有小孩,给他们称体重时发现,他们每个人的体重都不一样,且体重(单位:公斤)恰好是10的整数倍,且他们的体重都不高 于50公斤,已知赵…

浮点数的存储

-------------------------------------------------------------------------------- 在VC6.0----float环境一共32位 其中第一位是符号位 第二到第9位中间8位为小数点位置(指数以127的二进制为原点向下为负指数 向上为正指数)后面23位为数据位。 S EE…

第二阶段总结

结合第二阶段后3天,我们试用了UI,antionbar,menu等实用,成功的做出了字体的转换,题目的转化等功能。 其实四则运算,说难不难 说易不易,总结出 主要有付出,就有回报。 menu等做的过程…

const 和指针

c用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来。 如下: const Data* pData;Data const * pDataData * const pDataconst Data * const pData Data const * const pData是不是有点晕? 我其实用得最多的是 const Data* pData, 也…

Linux 查看系统用户的登录日志

查看用户登录系统的日志有两类日志记录用户登录的行为,一是记录登录者的数据,一个是记录用户的登录时间一,记录用户登录数据/var/log/wtmp日志文件记录用户登录的数据。但这个文件是被编码的文件,不能直接用vi、cat等命令查看&…

Android -- 自定义权限

在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作。如果应用需要执行某些操作,就需要声明使用这个操作对应的权限。 (在manifest文件中 添加标记)。 ap…

Win32 路径操作API

路径操作相关API 路径截断与合并函数 PathRemoveArgs 去除路径的参数 PathRemoveBackslash 去除路径最后的反斜杠“\” PathAddBackslash 在路径最后加上反斜杠“\” PathRemoveBlanks 去除路径前后的空格 PathAddExtension 在文件路径后面加上扩展名 Pa…

dbms_output.put_line长度限制问题

dbms_output.put_line长度限制问题对于10g以上版本(包括10g), dbms_output.put_line的最大长度限制是32767. 如果报错buffer overflow, 执行如下语句即可:set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED对于10g以下版本dbms_output.put_line最大长度限制是255.转载于…

js深入研究之Person类案例

<script type"text/javascript"> /* 定义一个Person类 */ function Person(name, age) {this.name name;this.age age; } /* 添加两个方法getName getAge */ Person.prototype {getName: function() {return this.name;},getAge: function() {return this.a…

C++名称粉碎

C name mangling 1: ?0: 构造器&#xff0c;?1 析构器 2: QAE: public __thiscall AAE: private __thiscall QBE: public __thiscall const 3: 返回值和参数类型 B&#xff1a;const D&#xff1a;char E&#xff1a;unsigned char F&#xff1a;…

一款基于css3鼠标经过圆形旋转特效

今天给大家分享一款基于css3鼠标经过圆形旋转特效。当鼠标经过的时候图片边框颜色旋转&#xff0c;图片显示详情。该实例适用浏览器&#xff1a;IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 ht…

Delphi与Windows 7下的用户账户控制(UAC)机制

WIN7/WIN8/WIN10, Vista提供的UAC机制&#xff0c;它的主要目的是防止对于操作系统本身的恶意修改。 对于Delphi程序的影响&#xff0c;UAC主要在于以下几点&#xff1a; 1、由于UAC机制&#xff0c;Delphi对于系统的操作可能无声的失败&#xff0c;而同样的程序&#xff0c;在…

[转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

以下内容转自&#xff1a; 作者&#xff1a;Lucida 微博&#xff1a;peng_gong 豆瓣&#xff1a;figure9 原文链接&#xff1a;http://zh.lucida.me/blog/java-8-lambdas-insideout-library-features 本文谢绝转载&#xff0c;如需转载需征得作者本人同意&#xff0c;谢谢。 --…

Eclipse生成jar包

前言: 本宅因为要写XXX软件的一个插件,来用用java,接触3天后 在打jar包上卡住了..... 经过大量的百度搜索后有如下几种解决方案: 解决方案: 一.安装Fatjar 在线安装地址:http://kurucz-grafika.de/fatjar 悲剧的是我怎么也安装不上去,于是放弃(在线下载包什么 我的Eclipse版…

Buffer和Cache的区别

现在不都是只有page cache了吗&#xff1f; buffer pages其实也是page cache里面的页。只是多了一层抽象&#xff0c;通过buffer_head来进行一些访问管理对,从Linux算法实现的角度&#xff0c;page cache和buffer cache目前是一样的&#xff0c;但是从功能抽象和具体应用来讲&a…

Android刷机

这里也有一篇比较详细的 http://blog.csdn.net/qq1084283172/article/details/52334452 官网刷机包 https://developers.google.com/android/images#hammerhead 我的机器是Nexus 5 一. 安装驱动 如何进入fastboot模式 1. 拔掉数据线&#xff0c;将手机关机 2. 关机后同时按…

中西医与算法之间的联系

中西医的特点网上有非常多讨论&#xff0c;概括起来就是西医治病&#xff0c;中医不治病 这个观点有部分道理&#xff0c;但不全对 中医落后的原因有非常多&#xff0c;但假设能用计算机的算法改进一下应该有非常大提升 比方翻译&#xff0c;比方路线规划&#xff0c;比方信号识…

程序的版式

版式虽然不会影响程序的功能&#xff0c;但会影响可读性。程序的版式追求清晰、美观&#xff0c;是程序风格的重要构成因素。可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然&#xff0c;看得兴致勃勃。差的程序“书法”如螃蟹爬行&#xff0c;让人看得索然…