從.Net MemoryMappedFile提供Win32句柄的屬性或方法(如果有的話)是什麼?從MemoryMappedFile獲取Win32句柄
我有非託管C++代碼讀取和寫入C風格的文件,如標準輸入和標準輸出。我想使用MemoryMappedFile :: CreateNew創建一個MemoryMappedFile,然後獲取可以轉換爲FILE *的Win32 HANDLE,以用於非託管C++。我看到MemoryMappedViewAccessor :: SafeMemoryMappedViewHandle和SafeHandle和其他可能性,但我沒有找到任何說明(或通過示例顯示)該句柄可以用作C/C++程序中的Win32句柄的任何內容。我只是不確定具體是什麼提供了Win32 HANDLE。還有其他的可能性,比如使用所有的Windows API和沒有.Net,但我問是否可以使用MemoryMappedFile來完成,我相信如果使用MemoryMappedFile無法完成的話,我可以使用所有Windows API來完成。
更新:以下是@MichaelGunter轉換爲C++的代碼。看到漢斯帕斯坦的評論,他說這不起作用,事實並非如此。從safeHandle-> DangerousGetHandle()返回的句柄似乎有效,但是當我調用_open_osfhandle來轉換句柄時,它會失敗。
MemoryMappedFile^ mmf = nullptr;
try { mmf = MemoryMappedFile::CreateNew("testmap", 10000, MemoryMappedFileAccess::ReadWrite); }
catch (Object^ ex)
{
// show error
return;
}
SafeMemoryMappedFileHandle^ safeHandle = mmf->SafeMemoryMappedFileHandle;
bool success = false;
safeHandle->DangerousAddRef(success);
if (!success)
{
// show error
return;
}
IntPtr handle = safeHandle->DangerousGetHandle();
if (safeHandle->IsInvalid)
{
// show error
return;
}
pin_ptr<const wchar_t> wchstr = PtrToStringChars(Message);
if (!Put((intptr_t)handle, const_cast<wchar_t*>(wchstr)))
{
// show error
return;
}
safeHandle->DangerousRelease();
這就是「Put」功能。
BOOL Put(intptr_t h, wchar_t* Message) {
int fd = _open_osfhandle(h, 0);
if (fd < 1)
return FALSE;
FILE * fp = _wfdopen(fd, L"w");
fputws(Message, fp);
return TRUE;
}
的MemoryMappedFile::SafeMemoryMappedFileHandle Property 文檔中說,我需要的安全權限,所以我用在一些地方以下。
[SecurityPermissionAttribute(SecurityAction::LinkDemand, UnmanagedCode = true)]
沒有直接的方法來做到這一點;但這可能會有所幫助:http://stackoverflow.com/questions/5193579/how-make-file-from-handle-in-winapi –
@丹,是的,謝謝。我知道這一點。我應該在我的問題上說句柄。我很抱歉,感到困惑。我會嘗試更新我的問題來說句柄而不是FILE *。 – user34660
您不能將這樣的句柄轉換爲FILE *。 XY問題。 –