vc6.0 release版本下出现内容读写错误问题
来源:互联网 发布:java 字符串 整形 编辑:程序博客网 时间:2024/06/03 23:02
本来在DEBUG下运行的非常好,可是换成release后就出现了各种的内存读写错误,话说在DEBUG下,没有初始化的变量都被初始化为零了,而在RELEASE下则是随机数值,然后就各种查找错误,最后看到把动态链接库改成静态链接库,我就试了一下,终于行了,哎,不得不说WINDOWS啊你不地道。。。
网上查了一下静态链接库和动态链接库的区别,我简单总结一下:
1、如果是静态链接库模式,程序是把目标代码从库文件拷贝到执行文件,这样在DLL不在的情况下,程序依旧可以运行,动态则是运行过程中加载,前提是你要有DLL可以提供加载
2、明显静态模式下最终程序要大,而动态要小
遗憾地说:除了ender说的是正确的外,其他观点都有偏颇之处甚至是错误的。我的感觉是,大家受MFC的影响太深了,而没有看到事情的本质。
首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法。在真实世界中,有三个概念:Use static libary, static linked DLL, dynamic linked DLL.
多数人混淆了static libary 和 static linked DLL的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。
使用静态库(Use static libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll 文件,如C Run Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是CRT静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。
下面再谈static linked DLL 和 dynamic linked DLL又如何?
静态链接 (static linked DLL)从操作上在VC的Project|Settings...|Link (tab)|General (category)|Object/library modules 中设置和添加。比如要使用SDK中的PropertySheet() API, 就要在这里添加 comctl32.lib,然后再调用的源程序中#include <prsht.h> , 使用的地方直接调用PropertySheet()。当程序.exe启动时,系统会把对应comctl32.dll加载进来。作为DLL的静态引入库的.lib不包含函数的实现,只包含用于系统加载的信息,如对应的DLL名称,函数歧视地只在对应的DLL中的便宜等等。相比动态链接而言,静态链接是很简单的。
动态链接是使用LoadLibrary()/GetProcessAddress()和FreeLibrary(),详见下面的例子。
{
typedef BOOL (WINAPI *LPFNSHELLEXECUTEEX)(LPSHELLEXECUTEINFO);
hShell32Dll = LoadLibrary(TEXT( "SHELL32.DLL "));
if (!hShell32Dll) { goto End; }
lpfnShellExecuteEx = (LPFNSHELLEXECUTEEX)GetProcAddress(hShell32Dll,
API_NAME(ShellExecuteEx));
if (!lpfnShellExecuteEx) { goto End; }
...
fOk = (*lpfnShellExecuteEx)(pShellExecuteInfo);
...
End:
if (hShell32Dll) {
FreeLibrary(hShell32Dll);
}
lpfnShellExecuteEx = NULL;
...
}
有人会想,动态链接这样麻烦,为什么还要用呢?这里有一个技术问题,对这个问题的解决直接导致了动态加载的需求。问题是有些DLL只在某个Windows版本中存在,或某个API只在某些Windows版本中被加入指定的DLL。当你使用静态链接的.exe试图在不支持的Windows版本上运行时,系统会弹出系统对话框提示某某.dll无法加载或无法定位某某API的消息,然后就中止.exe的运行。像这样因为个别功能的实现依赖于某个DLL,当这个DLL不可用时导致整个.exe无法运行是不明智的。避免这样的结局只有用动态链接。
- vc6.0 release版本下出现内容读写错误问题
- vc6.0下使用release版本调试
- vc6.0调试release版本
- vc6.0 Release 版本调试
- vc6下release版本的调试设置
- Debug版本和Release版本区别及VC6.0下生成方式图解
- VC6.0 Release版本中调试设置
- 将VC6.0工程做成release版本
- VC6.0 Release 版本下调试运行设置
- 如何使用VC6.0发布release版本
- VC6.0 Release 版本下调试运行设置
- VC6.0 Release 版本下调试运行设置
- VC6.0环境下通过map文件查找常量表信息(release版本)
- VC6.0下debug和release版本的浮点运算结果不一致实例分析
- VC6.0在Release版本下如何调试——转载
- 在VC6.0中关于Debug和Release两种版本的问题
- Qt在VC6.0下编译出现链接错误
- Release版本下SetItem的错误
- STL 容器和迭代器连载6_顺序容器的操作3
- jQuery操作input
- wpf+.net 4.5 surface2.0 = 异步多点触控 时间轴 part1
- 【设计模式攻略】行为型模式之Template Method模式
- ASP.NET sqldatasource DROPDOWNLIST 参数查询
- vc6.0 release版本下出现内容读写错误问题
- 黑马程序员_原来这题可以这样写
- LINUX的多线程编程高效开发经验一个小BUG
- Android 入门基础(9) ---SharedPreferences
- infobright 简单的操作
- 反射
- 重写系统确认对话框,使默认选中项为“取消”
- PHPMailer通过163邮箱发信
- C#学习笔记(五)(Winform窗体)(一)