关于DLL中导出类、导出函数接口的参数

4 篇文章 0 订阅
        内存的申请与释放是编写DLL时经常带来麻烦的问题,下面举两个最近遇到的例子。
        1. vector&,与其它类似的参数错误的做法:以vector&形式传递参数,用来接收数据,在DLL内对vector进行填充。这样做会导致vector在DLL外析构时发生内存指针失效异常。这类问题只发生在程序静态编译的情况下。错误原因:vector在DLL通过pushback函数开辟了堆空间,析构时在DLL外进行内存释放。《Windows 核心编程》第5版19章 DLL编程有详细讲解。 正确的做法:以vector*形式传递参数,传递NULL指针到DLL,由DLL通过new开辟空间,能及填充内容。DLL提供释放接口函数类似 void destroy(vector* pVector); DLL的调用者在对数据使用完毕后,调用些函数进行内存释放。
        2. string,与其它在拷贝构造时会开辟空间的数据类型 错误的做法:通过传递形参提供数据给DLL BOOL IsPathExist(string strPath)。这样做会导致strPath在DLL函数IsPathExit退出时,调用string类的析构后发生内存指针失效异常。这类问题也只发生在程序静态编译的情况下。错误原因:strPath在函数被调用时,通过拷贝构造被创建,但此过程是发生在DLL外的!正确的做法:传递string& strPath,避免拷贝构造。
DLL函数查看器是一款DLL函数查看工具,直接把DLL文件拖入列表查看即可。 1.将本程序快捷方式放入系统 "SendTo" 目录后,就可以右键文件"发送到"实现文件快速查看 2.按粘帖键(Ctrl+V)将剪辑板字符串在列表匹配查找 3.关于参数量的问题,由于猜解方法过于简单对于部分函数未从当前函数返回,而是"JMP"到别的函数 所以猜解可能会有错误,需要结合已知函数库或反汇编查看,另此方法对于cdecl调用函数无效 4.关于反汇编视图的"到首返回"如果勾选即表示仅反汇编到头一个RETN为止,否者将按照"DisAsm_MaxLine" 所指定的行数.生效方法参见说明细则12~13. 5.将PEID userdb.txt 放置到程序目录下可以实现查壳 6.如果将易语言API伴侣DATA下文件复制到本目录,可获得已知函数信息.这首先要感谢API伴侣的作者 7.在目录下建立 "ViewApi.cfg" ,设置信息将写入配置文件可方便放入优盘等移动存储器使用 程序启动时会优先读取配置文件,如果文件不纯在则会访问注册表 8.如果你觉得这个美化窗口很浪费资源,可以打开注册表修改如下项值即可关闭 [HKEY_CURRENT_USER\Software\ViewApiList] "UI"=dword:00000000 9.如果你觉得反汇编影响了效率,可以打开注册表修改如下项值即可关闭 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm"=dword:00000000 10.如果想关闭查壳功能可以删除userdb.txt或注册表如下设置 [HKEY_CURRENT_USER\Software\ViewApiList] "CheckShell"=dword:00000000 11.在线查询接口可在注册表如下位置修改,{searchTerms}为保留关键字被作为替换函数名 [HKEY_CURRENT_USER\Software\ViewApiList] "WebSearch"="http://www.baidu.com/s?wd={searchTerms}&ie=utf-8" 12.是否仅反汇编到头一个返回,1.表示是,0表示否 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm_Retn"=dword:00000001 13.反汇编最大行数,即表示当前地址向后的长度,与函数实际长度无关.是否生效需要根据"DisAsm_Retn"设置 [HKEY_CURRENT_USER\Software\ViewApiList] "DisAsm_MaxLine"=dword:000003e8 键盘快捷键说明: TAB(SHIFT+TAB) -- 视图焦点切换 CTRL+S -- 视图切换 CTRL+F -- 文字搜索 F3 -- 搜索下一个 CTRL+A -- 项目全选 CTRL+C -- 复制选项目函数名称/汇编代码 CTRL+V -- 将剪辑板的字符在视图匹配搜索 ALT+← -- 反汇编视图上一次跳转的后退 ALT+→ -- ... 前进 Application -- 弹出右键菜单(右WIN键和右CTRL键间的那个键)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值