gpt4 book ai didi

c# - 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回给 C#

转载 作者:可可西里 更新时间:2023-11-01 18:05:59 24 4
gpt4 key购买 nike

我有一个 c++ dll,它为我的主要 c# 应用程序提供一些功能。在这里,我尝试读取一个文件,将其加载到内存中,然后返回一些信息,例如指向加载数据的指针和内存块计数到 c#。 Dll 成功将文件读取到内存,但在返回到主应用程序时,程序因堆损坏而崩溃(检测到严重错误 c0000374)。

代码非常简单明了,我以前做过一些类似的事情,没有问题,但是我无法弄清楚是什么导致了这里的问题,我尝试使用“new、malloc 和 GlobalAlloc”分配内存,但都没有帮助。代码如下:

C++ MyDll:

typedef unsigned long         U32;

extern "C" __declspec(dllexport) int ReadFile(LPSTR Path, U32** DataPtr, U32* Count)
{
FILE *fp;
U32 *Data;
CString tempStr(Path);
long fSize;

if(!(fp = fopen(tempStr, "rb"))) {
return 0;
}

// Obtain File Size;
fseek(fp, 0, SEEK_END);
fSize = ftell(fp);
rewind(fp);

Data = (U32 *)GlobalAlloc(0, fSize);
if(Data == NULL) {
fclose(fp);
return -1;
}

// Copy file into the buffer.
if(!(*Count = fread(Data, sizeof(U32), fSize / sizeof(U32), fp))) {
fclose(fp);
free(Data);
return -2;
}

*DataPtr = (U32 *)Data;
return 1;
}

C# 应用程序:

        [DllImport(@"MyDll.dll", CallingConvention= CallingConvention.Cdecl)]
private static extern int ReadFile([MarshalAs(UnmanagedType.LPStr)]string Path, out IntPtr dataPtr, out uint Count);

private void readDump(string Path)
{
uint count = 0;
IntPtr Data = new IntPtr();

try{
if(ReadFile(Path, out Data, out count) == 1) //The Program crashes just right after this statement
{
//Do Something ...
}
}
catch() {}

}

程序在调试和 Release模式下都会崩溃。除非我在加载文件后以 Debug模式暂停程序并在“Visual Studio 的立即窗口”中调用一些内存块。要加载的文件大小约为 64MB,PC 上有超过 2GB 未使用的内存。

更新: 我注意到,他们之前使用的一些第三方程序因“异常代码:c0000005”而崩溃,并且在 Windows 7(主机)中发生了一些其他奇怪的事情。所以我在另一个安装的 Windows 中测试了代码,一切似乎都正常工作。所以可能与 Windows 7 有关。现在我该如何解决这个问题? “sfc/scannow”未能发现任何问题。

最佳答案

如果您所有的代码确实如上所示,那么我看不出问题所在。然而,当我遇到这个问题时,有时是因为 malloc/new/whatever 检测到堆损坏,通常这种损坏已经在程序中之前发生,但崩溃已延迟到下一次调用 new/malloc。

如果您在上述执行和崩溃之前读取其他文件,或者分配或释放其他缓冲区,我会在那里寻找问题。也许在你写入缓冲区的任何地方抛出一堆断言,并检查边界和你正在写的内容是否溢出。抱歉,这不是一个具体的答案,我没有足够的代表来留下这个建议作为评论。

关于c# - 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23471161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com