在C语言中,什么等价于Marshal.PtrToStringAnsi(C#)?
因为,我想在C中重写一个函数C。
这是C#函数:
public int GetProcessName(uint processId, out string name)
{
IntPtr ptr = Marshal.AllocHGlobal((int)(0x211)); int result = -1;
result = getProcessName(processId, ptr);
name = String.Empty;
if(SUCCESS(result))
name = Marshal.PtrToStringAnsi(ptr);
Marshal.FreeHGlobal(ptr);
return result;
}
实际上我的C函数:
int
GetProcessName(uint processId, char *name)
{
HINSTANCE hLib = LoadLibrary("CCAPI.DLL");
__cGetProcessName getProcessName = (__cGetProcessName)GetProcAddress(hLib, "CCAPIGetProcessName");
int *ptr = malloc((int)(0x211));
int result = -1;
result = getProcessName(processId, ptr);
name = "";
if (SUCCESS(result))
{
name = /* ?? */;
}
free(ptr);
return (result);
}
最佳答案
在C#中,Marshal.PtrToStringAnsi
接受一个指针并返回一个string
。
在C中,没有string
类型,也没有现成的等价类型。最接近的是指向以空字符(char*
)结尾的字符数组的'\0'
。按照惯例,我们称之为“C字符串”(尽管它不是自己的类型)。
因此,如果你有一个char*
,那么你已经有了一个在C中的Marshal.PtrToStringAnsi
(作为char*
)的输出的C等价物。
所以这句话:
name = Marshal.PtrToStringAnsi(ptr);
可能是这样的:
name = ptr;
但是,由于您似乎在最后释放了
IntPtr
缓冲区,并且您希望在外部提供的缓冲区中得到结果,所以C中正确的替代方法实际上是:strcpy(name, ptr);
关于c# - C/C#-Marshal.PtrToStringAnsi,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31103422/