从.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问题。 –