0
传递一个C#字符串
C#的一面:通过PInvoke的
[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'd字符串传递的,我需要在C/C++端释放它,还是CLR会帮我处理它?如果它正在清理,我是否正确传递?我可以通过它作为一个普通的C#字符串没有[MarshalAsAttribute(UnmanagedType.LPWStr)]
?谢谢!
OK删除绳子,让我明白你说什么,有什么我需要改变? – Wes 2015-04-03 21:47:10
正确........ – pm100 2015-04-03 22:17:06