c# - 通过 Pinvoke 传递 C# 字符串

标签 c# c++ .net c pinvoke

C# 端:

    [DllImport(@"FileGuidUtils.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
    private static extern long getReparseType([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath);

C/C++ 方面:

__declspec(dllexport) ReparseType getReparseType(WCHAR *linkPath) {
    HANDLE hFile = CreateFile(linkPath, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        CloseHandle(hFile);
        return NEITHER;
    }

    REPARSE_DATA_BUFFER *reparseDataBuffer = (REPARSE_DATA_BUFFER *)malloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
    DWORD dwRetLen = 0;
    BOOL bRet = DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, reparseDataBuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &dwRetLen, NULL);
    if (bRet == FALSE)
    {
        free(reparseDataBuffer);
        CloseHandle(hFile);
        return NEITHER;
    }

    ULONG reparseType = reparseDataBuffer->ReparseTag;
    free(reparseDataBuffer);
    CloseHandle(hFile);

    if (reparseType == IO_REPARSE_TAG_SYMLINK) {
        return SYMLINK;
    }
    else if (reparseType == IO_REPARSE_TAG_MOUNT_POINT) {
        return JUNCTION;
    }

    return NEITHER;
}

linkPath是如何传递的?它是作为 malloc 字符串传递的,我需要在 C/C++ 端释放它,还是 CLR 会为我处理它?如果它正在清理,我是否正确传递了它?我可以将它作为普通的 C# 字符串传递,而不使用 [MarshalAsAttribute(UnmanagedType.LPWStr)] 吗?谢谢!

最佳答案

C# 将为您将 C# 字符串复制到非托管内存中,传递指向它的指针并在函数调用完成后删除该字符串

关于c# - 通过 Pinvoke 传递 C# 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29439674/

相关文章:

C++ 模板化 STL 容器

python - 当尝试使用 pythonnet 从脚本构建 exe 时,py2exe 失败并显示 "No module named ' clr'"

c# - 如何在 jQuery 中调用 C# 方法?

c# - 如何使用 openpop.net 下载多个附件

c# - 跟踪正在移动的文件(可能在磁盘之间),VB.NET(或C#)的最佳方法

c# - WCF 服务引用 - 重用类型时未生成代理

.net - "Cannot start Omnisharp because Mono version >=3.10.0 is required"

c# - 如何限制 MVC 文本框中字符的长度?

c++ - Windows 虚拟键代码

c++ - 修改二叉搜索树