怎么在如何反编译dll文件时将所有引用的dll文件加载到debug目录下

2012年12月 总版技术专家分月排行榜第一2012年10月 总版技术专家分月排行榜第一2012年9月 总版技术专家分月排行榜第一2012年8月 总版技术专家分月排行榜第一
2012年11月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。君,已阅读到文档的结尾了呢~~
生成解决方案以后为什么bin目录下没有dll文件呢-
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
生成解决方案以后为什么bin目录下没有dll文件呢-
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口1252人阅读
C/C#/C++/JAVA(58)
静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。
如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面。这是静态链接库的一个弊端。
动态链接库有两种加载方式:隐式加载和显示加载。
隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存。隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受。显式加载又叫运行时加载,指主程序在运行过程中需要DLL中的函数时再加载。显式加载是将较大的程序分开加载的,程序运行时只需要将主程序载入内存,软件打开速度快,用户体验好。
首先创建一个工程,命名为 cDemo,添加源文件 main.c,内容如下:
找到上节创建的 dllDemo 工程,将 debug 目录下的&dllDemo.lib 和&dllDemo.dll 复制到当前工程目录下。
前面已经说过:.lib 文件包含DLL导出的函数和变量的符号名,只是用来为链接程序提供必要的信息,以便在链接时找到函数或变量的入口地址;.dll 文件才包含实际的函数和数据。所以首先需要将
dllDemo.lib 引入到当前项目。
选择”工程(Project) -& 设置(Settings)“菜单,打开工程设置对话框,选择”链接(link)“选项卡,在”对象/库模块(Object/library modules)“编辑框中输入
dllDemo.lib,如下图所示:
但是这样引入 .lib 文件有一个缺点,就是将源码提供给其他用户编译时,也必须手动引入 .lib 文件,麻烦而且容易出错,所以最好是在源码中引入 .lib 文件,如下所示:
#pragma comment(lib, &dllDemo.lib&)
更改上面的代码:
点击确定回到项目,编译、链接并运行,输出结果如下:
Congratulations! DLL is loaded!
a+b=15
在 main.c 中除了用 extern 关键字声明 add() 和 sub() 函数来自外部文件,还可以用&_declspec(dllimport) 标识符声明函数来自动态链接库。
为了更好的进行模块化设计,最好将 add() 和 sub() 函数的声明放在头文件中,整理后的代码如下:
显式加载动态链接库时,需要用到 LoadLibrary() 函数,该函数的作用是将指定的可执行模块映射到调用进程的地址空间。LoadLibrary() 函数的原型声明如下所示:
HMODULE &LoadLibrary(LPCTSTR 1pFileName);
LoadLibrary() 函数不仅能够加载DLL(.dll),还可以加载可执行模块(.exe)。一般来说,当加载可执行模块时,主要是为了访问该模块内的一些资源,例如位图资源或图标资源等。LoadLibrary()
函数有一个字符串类型(LPCTSTR)的参数,该参数指定了可执行模块的名称,既可以是一个.dll文件,也可以是一个.exe文件。如果调用成功, LoadLibrary() 函数将返回所加载的那个模块的句柄。该函数的返回类型是HMODULE。&HMODULE类型和HINSTANCE类型可以通用。
当获取到动态链接库模块的句柄后,接下来就要想办法获取该动态链接库中导出函数的地址,这可以通过调用 GetProcAddress() 函数来实现。该函数用来获取DLL导出函数的 地址,其原型声明如下所示:
FARPROC &GetProcAddress(HMODULE hModule, LPCSTR 1pProcName);
可以看到,GetProcAddress函数有两个参数,其含义分别如下所述:
hModule:指定动态链接库模块的句柄,即 LoadLibrary() 函数的返回值。1pProcName:字符串指针,表示DLL中函数的名字。
首先创建一个工程,命名为 cDemo,添加源文件 main.c,内容如下:
找到上节创建的 dllDemo 工程,将 debug 目录下的 dllDemo.dll 复制到当前工程目录下。注意,只需要 dllDemo.dll,不需要 dllDemo.lib。
运行程序,输出结果与上面相同。
HMODULE 类型、HINSTANCE 类型在 windows.h 中定义;LoadLibrary() 函数、GetProcAddress() 函数是Win32 API,也在
windows.h 中定义。
通过以上的例子,我们可以看到,隐式加载和显式加载这两种加载DLL的方式各有 优点,如果采用动态加载方式,那么可以在需要时才加载DLL,而隐式链接方式实现起来比较简单,在编写程序代码时就可以把链接工作做好,在程序中可以随时调用DLL导出的函数。但是,如果程序需要访问十多个DLL,如果都采用隐式链接方式加载它们的话,
那么在该程序启动时,这些DLL都需要被加载到内存中,并映射到调用进程的地址空间, 这样将加大程序的启动时间。而且,一般来说,在程序运行过程中只是在某个条件满足时才需要访问某个DLL中的某个函数,其他情况下都不需要访问这些DLL中的函数。但是这时所有的DLL都已经被加载到内存中,资源浪费是比较严重的。在这种情况下,就可以采用显式加载的方式访问DLL,在需要时才加载所需的DLL,也就是说,在需要时DLL才会被加载到内存中,并被映射到调用进程的地址空间中。有一点需要说明的是,实际上, 采用隐式链接方式访问DLL时,在程序启动时也是通过调用LoadLibrary()
函数加载该进程需要的动态链接库的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133387次
积分:2000
积分:2000
排名:千里之外
原创:48篇
转载:73篇
译文:11篇
评论:18条
(9)(24)(5)(1)(56)(10)(2)(1)(24)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'posts - 390,&
comments - 52,&
trackbacks - 0
1、每种方法也要复制相应的DLL文件到相应目录,或者设定DLL目录的位置,具体方法为:"Properties"&-&&"Configuration&Properties"&-&&"Debugging",在"Working&Directory"设置dll的路径就可以了
2、无论是设置DLL目录,或者是Lib目录,亦或是头文件的目录,都有release版本和debug版本的区分,每种版本的设置都是独立的,要分别设置。
------------------------------------------------------------------------------------------------------------------------------------------
方法1: &通过设置工程配置来添加lib库.
A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。
B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。C &然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。
这种方法比较繁琐,且不直观,而且还可能要争对debug版本和release版本作不同的配置,因为我们生成的两个版本的库可能放在不同的目录中的.
方法2: 使用编译语句:
#ifdef _DEBUG#pragma comment(lib,"..\\debug\\LedCtrlBoard.lib")#else#pragma comment(lib,"..\\release\\LedCtrlBoard.lib")#endif
这种方法直观,方便,且可以按如上直接区分出Debug版本和Release版本的不同目录.当然,通过宏,还可以区分更多版本.
但是在指定目录时,不小心容易出错.
方法3: 直接添加库文件到工程中.
就像你添加.h和.cpp文件一样,把lib文件添加到工程文件列表中去.
VC中,切换到"解决方案视图",---&选中要添加lib的工程--&点击右键--&"添加"--&"现有项"--&选择lib文件--&确定.
就是这么简单,搞定.
这个方法适用于在我的工程的debug版本和Release版本中都使用同一个lib库文件时.这样就省去了你1方法配置环境的繁琐,也省去了方法2种语句的可能性错误发生.
阅读(...) 评论()8556人阅读
当软件引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱,如果能把dll放到响应的文件夹下面,就方便很多
& &下面是解决该问题的一种方法:
& &右键点击项目:属性-》设置,项目会生成一个app.config文件,在&configuration&节点后面添加下面的节点(好像别人说是要添加到最后才有效)&runtime&
&gcConcurrent enabled=&true& /&
&assemblyBinding xmlns=&urn:schemas-microsoft-com:asm.v1&&
&publisherPolicy apply=&yes& /&
&probing privatePath=&32;64& /&
&/assemblyBinding&
&/runtime&& &如果是多个目录,则用分号分开
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:126607次
积分:2037
积分:2037
排名:第19474名
原创:77篇
转载:17篇
(5)(8)(2)(1)(1)(1)(1)(1)(3)(3)(2)(2)(5)(3)(1)(4)(2)(7)(13)(1)(5)(2)(2)(10)(1)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 dll文件可以反编译吗 的文章

 

随机推荐