2

我有以下标题和 CPP:

“实用程序.h”

__declspec(dllexport) static char* GetRamMegabytes(char* &FreeMemory);

“实用程序.cpp”

char* Utils::HardWare::GetRamMegabytes(char*  &FreeMemory)
 {
    char*  TotalMb = "";
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);
    float freeMemFloat = ((float)statex.ullAvailPhys/1024/1024);
    float value =((float)statex.ullTotalPhys/1024/1024);
    sprintf(FreeMemory,"%f",value);
    sprintf(TotalMb,"%f",freeMemFloat);
    return TotalMb;
 }

我已经编译了我的 DLL,我正在尝试使用以下代码从 C# 制作一个 PInvoke:

[DllImport("LndNativeAssembly.dll", EntryPoint = "?GetRamMegabytes@HardWare@Utils@@SAPADAAPAD@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern IntPtr GetRamMegaBytes(IntPtr freemem);

我正在尝试使用以下方法调用本机函数:

IntPtr free = IntPtr.Zero;
IntPtr res = GetRamMegaBytes(free);

我得到这个错误:

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

4

2 回答 2

2

这是写入未分配的内存。

sprintf(TotalMb,"%f",freeMemFloat);

您可以在例程中使用 new 分配内存并在调用者中释放它,或者您可以在例程中使用固定缓冲区(不是线程安全的)。

于 2012-11-12T14:35:26.227 回答
2

这是因为 Free 是函数尝试写入的目标,而您传递的是NULL,这会导致 GPF。问题是您如何编写 PInvole 签名。尝试:

public static extern IntPtr GetRamMegaBytes(StringBuilder freemem);

and pass a created string builder to the function.

于 2012-11-12T14:39:03.003 回答