我从谷歌那里读到,它用于控制应用程序级别的缓冲区溢出,并由CRT调用.它也说
"本质上,在进入受溢出保护的函数时,cookie被放在堆栈上,退出时,堆栈上的值将与全局cookie进行比较.它们之间的任何差异都表示发生了缓冲区溢出并导致立即终止该计划."
但是我无法理解它是如何工作的?请帮忙.
我正在使用VS2008开发一个COM dll,它默认使用CRT版本9,但我使用的TSF(文本服务框架)与新的CRT不兼容.我认为解决方案是使用兼容的解决方案,那么如何指定CRT版本呢?
Visual C++ 2005我在我的系统上构建使用CRT DLLs版本8.0.50727.4053.我相信它是最新版本,并由Windows自动更新.
在用户系统上,找不到此版本的DLL.我以前使用vcredist_x86.exe作为安装程序的一部分来安装运行时DLL.它曾经工作过.
我的问题是即使最新版本的vcredist_x86.exe(Microsoft Visual C++ 2005 SP1可再发行组件包(x86))也不安装此版本的DLL.
那么我需要哪个vcredist_x86.exe文件呢?
PS会强迫我的应用程序链接到特定版本的CRT解决问题?这是一种首选方法吗?
谢谢,
保罗
更新:还有其他人观察到vcredist_x86.exe(Microsoft Visual C++ 2005 SP1可再发行组件包(x86))未安装8.0.50727.4053.
更新2:至少有一个人建议强制使用以前版本的CRT(http://tedwvc.wordpress.com/).然而,这会给我们的项目增加极大的复杂性.
我有一些代码在大型系统中崩溃.但是,代码基本上归结为以下伪代码.我已经删除了很多细节,因为我试图把它煮到骨头上; 我不认为这会错过任何重要的事情.
// in a DLL:
#ifdef _DLL
#define DLLEXP __declspec(dllexport)
#else
#define DLLEXP __declspec(dllimport)
#endif
class DLLEXP MyClass // base class; virtual
{
public:
MyClass() {};
virtual ~MyClass() {};
some_method () = 0; // pure virtual
// no member data
};
class DLLEXP MyClassImp : public MyClass
{
public:
MyClassImp( some_parameters )
{
// some assignments...
}
virtual ~MyClassImp() {};
private:
// some member data...
};
Run Code Online (Sandbox Code Playgroud)
和:
// in the EXE:
MyClassImp* myObj = new MyClassImp ( some_arguments ); …
Run Code Online (Sandbox Code Playgroud) 现在,Visual C++的动态运行时库(更具体地说是2008)是Windows操作系统的一部分吗?我注意到,至少在Windows 8上,您不再需要随应用程序一起提供这些内容,或让用户安装Microsoft的可再发行组件包.
这是真的?如果是这样,那么适用于哪些Windows版本以及适用于哪些版本的Visual C++?
我正在尝试使用MinGW for Windows构建DLL.我知道默认使用MinGW进行构建会引入对Windows附带的msvcrt.dll的依赖.但是,我希望我的DLL不依赖于msvcrt.dll.相反,我希望使用msvcr110.dll(Visual Studio 2012 CRT)来满足我的DLL的C运行时依赖性.
我需要这样做的原因是因为我尝试构建的源代码使用了VC11编译器中没有的一些C99功能,因此必须使用MinGW构建.同时,在Windows 8 Store应用程序中不允许使用依赖于msvcrt.dll的DLL(这是我正在尝试构建的).相反,如果DLL依赖于msvcr110.dll,则允许在Windows应用商店中使用.
所以我唯一的选择是使用MinGW构建,但仍然链接到msvcr110.dll.
我怎样才能做到这一点?
请考虑以下情形:应用程序链接到第三方库A.
A使用MSVC 2008构建,并且静态链接(即使用/ MT构建)到C运行时库v9.0.
该应用程序使用MSVC 2005构建,并静态链接到A和(使用/ MT)到C运行时库v8.0.
我可以看到这个问题 - 例如,如果在运行时库版本之间的标题中更改了类型.
是否注意使运行时库头在版本之间保持兼容,或者是否应始终确保所有静态链接库都链接到运行时库的相同版本?
我已经制作了一个简单的资源包装器,用于将我的游戏资源打包到一个文件中.在我开始编写解包器之前,一切都很顺利.我注意到我已经打包的.txt文件--26个字节 - 来自资源文件,没有任何问题,保留了所有数据.但是,当读取我在资源文件中打包的.PNG文件时,前5个字节完好无损,而其余的则完全无效.
我追溯到打包过程,我注意到fread只读取.PNG文件的前5个字节,我不能为我的生活找出原因.它甚至触发'EOF'表示文件只有5个字节长,而实际上它是一个787字节的小多边形PNG,100px×100px.
我甚至通过单独的应用程序来简单地将这个PNG文件读入缓冲区来测试这个问题,我得到相同的结果,只读取5个字节.
以下是该小型独立应用程序的代码:
#include <cstdio>
int main(int argc, char** argv)
{
char buffer[1024] = { 0 };
FILE* f = fopen("test.png", "r");
fread(buffer, 1, sizeof(buffer), f);
fclose(f); //<- I use a breakpoint here to verify the buffer contents
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以指出我的愚蠢错误吗?
我最近收到了这个警告(VC++ 2010)
warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
我假设这是关键部分.我的操作系统课程已经有一段时间了,所以我无法弄清楚这意味着什么.如果我没记错的话,关键部分可以使用共享资源.那么这个警告是如何相关的呢?它究竟意味着什么?
c++ msvcrt visual-studio-2010 critical-section static-initializer
这是前一个问题的一个子集.
作为练习,我正在编写一个内存管理器 - 即实现malloc,realloc和free(或new和delete)的代码.我的语言Delphi 的RTL允许轻松替换RTL的内存管理器.对于那些使用C++的人来说,这类似于,但是低于覆盖新的和删除(它挂钩到RTL本身而不是语言功能.)
我正在寻找有关高质量方法的资源,其他人已经解决了同样的问题,并试图找出其他主要编译器供应商使用的算法.虽然Delphi有很好的文档记录,但我找不到有关MS VC++,.Net或Objective C所使用的实现的任何信息.这些供应商似乎(?)不允许他们的RTL像Delphi那样被挂钩.所有文档似乎都是更高级别的,例如NSAutoReleasePool
选择一个随机的例子 - 对于这个问题来说太高级了.
主要供应商(Microsoft VC++和.Net以及Apple Objective C)在其运行时库中使用哪些内存管理算法?
一个很好的答案的例子是描述内存管理器实现的文档,例如这个,或者是发布论文的链接.一个有用的答案的例子是算法,'VC++运行时使用Hoard分配器 '.