尝试读取或写入受保护的内存。这通常表明其他内存已损坏 DllImport
Posted
技术标签:
【中文标题】尝试读取或写入受保护的内存。这通常表明其他内存已损坏 DllImport【英文标题】:Attempted to read or write protected memory. This is often an indication that other memory is corrupt DllImport 【发布时间】:2016-03-11 10:56:19 【问题描述】:我在 C++ 中创建了一个 dll。我在该 dll 中有一个函数,其中包含以下代码。
__declspec(dllexport) void MyFunction(CString strPath)
BYTE startBuffer[] = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 ;
FILE *f = _wfopen(strPath.GetBuffer(strPath.GetLength()), _T("wb"));
if (f != NULL)
strPath.ReleaseBuffer();
fwrite(startBuffer, sizeof(startBuffer), 1, f);
fclose(f);
如果我评论这一行,然后调用 dll。不会有问题的。
调用约定如下:
[DllImport("OutExt.dll",CharSet=CharSet.Unicode)]
static extern void MyFunction([MarshalAs(UnmanagedType.LPStr)] string strPath);
请有人帮我解决这个问题。
【问题讨论】:
在您提供真实详细信息之前,我们无法为您提供帮助。显示一个完整的问题。您正在调用的整个 C++ 函数。以及调用它的整个 C# 代码。不要展示你的整个项目。将其缩减为minimal reproducible example。 @DavidHeffernan 你现在能帮忙吗?如果你愿意,你可以把这两个代码都放在 dll 项目和 c# 项目中。然后你就可以看清楚了 【参考方案1】:CString
是不能使用 p/invoke 编组的本机 C++ 类。您将需要使用指针以空字符结尾的字符数组。
要么:
__declspec(dllexport) void MyFunction(const char *strPath)
如果您必须限制自己使用旧版 ANSI 代码页,或者
__declspec(dllexport) void MyFunction(const wchar_t *strPath)
对于 Unicode。
在 C# 方面,声明将是:
[DllImport("OutExt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void MyFunction(string strPath);
和
[DllImport("OutExt.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
static extern void MyFunction(string strPath);
分别。
【讨论】:
以上是关于尝试读取或写入受保护的内存。这通常表明其他内存已损坏 DllImport的主要内容,如果未能解决你的问题,请参考以下文章
尝试读取或写入受保护的内存。这通常表明其他内存已损坏 DllImport