最近做的项目,外壳是用C#写的,核心代码使用C++写的。在C#调用C++的DLL的过程中发现了以下的错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
以下是C++的函数实现:
#pragma comment(linker, "/SECTION:MYSEC,RWS") #pragma data_seg("MYSEC") char ResultBuffer[10000]; //ResultBuffer 是共享数据段中的一个char型数组,用来实现跨进程通信的#pragma data_seg()
extern "C" __declspec(dllexport) char* GetRecordInfo()
{
OutputDebugStringA(ResultBuffer);
return ResultBuffer;
}C#下函数声明如下:
[DllImport("HooksLib.dll")]
public static extern StringBuilder GetRecordInfo();调用时,可以在DbgView中看到 ResultBuffer的值是正确的,但是在C#的代码中发生了尝试读取或写入受保护的内存。这通常指示其他内存已损坏的错误。
原来猜想是C#和C++中Char长度不一样,C#占两个字节,C++一个字节的问题,但是把Char转成了wchar_t也还是错。
花了两天时间,没能解决问题。希望有哪位高手,指导下。
以下是C++的函数实现:
#pragma comment(linker, "/SECTION:MYSEC,RWS") #pragma data_seg("MYSEC") char ResultBuffer[10000]; //ResultBuffer 是共享数据段中的一个char型数组,用来实现跨进程通信的#pragma data_seg()
extern "C" __declspec(dllexport) char* GetRecordInfo()
{
OutputDebugStringA(ResultBuffer);
return ResultBuffer;
}C#下函数声明如下:
[DllImport("HooksLib.dll")]
public static extern StringBuilder GetRecordInfo();调用时,可以在DbgView中看到 ResultBuffer的值是正确的,但是在C#的代码中发生了尝试读取或写入受保护的内存。这通常指示其他内存已损坏的错误。
原来猜想是C#和C++中Char长度不一样,C#占两个字节,C++一个字节的问题,但是把Char转成了wchar_t也还是错。
花了两天时间,没能解决问题。希望有哪位高手,指导下。
FreeLaxy, your backup.
=======================================================