在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/

10-12 21:24