2015-04-03 69 views
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)]?謝謝!

回答

1

C#將使C#字符串你到非託管內存的副本,將指針傳遞給它,一旦函數調用結束

+0

OK刪除繩子,讓我明白你說什麼,有什麼我需要改變? – Wes 2015-04-03 21:47:10

+0

正確........ – pm100 2015-04-03 22:17:06