尝试读取或写入受保护的内存。这通常表明其他内存已损坏 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

尝试读取或写入受保护的内存。这通常表明 c# 中的其他内存已损坏(访问冲突)

错误:试图读取或写入受保护的内存。这通常表明其他内存已损坏

错误“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”