gpt4 book ai didi

C# PInvoke - 函数返回 char* 并带有引用 char* 参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:51 25 4
gpt4 key购买 nike

我有以下 header 和 CPP:

“Utils.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);

我正在尝试使用以下方式调用 native 函数:

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

我得到这个错误:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

最佳答案

这是写入未分配的内存。

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

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

关于C# PInvoke - 函数返回 char* 并带有引用 char* 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345548/

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