.Net MemoryMappedFileからWin32 HANDLEを提供するプロパティまたはメソッド(存在する場合)とは何ですか?MemoryMappedFileからWin32 HANDLEを取得します。
私は、Cスタイルのファイル(stdinやstdoutなど)との間で読み書きを行うアンマネージドC++コードを用意しています。 MemoryMappedFile :: CreateNewを使用してMemoryMappedFileを作成し、Unmanaged C++で使用するFILE *に変換できるWin32 HANDLEを取得します。私はMemoryMappedViewAccessor :: SafeMemoryMappedViewHandleとSafeHandleなどの可能性を参照していますが、ハンドルがC/C++プログラムでWin32ハンドルとして使用できることを示す(または例で示す)ものは見つかりません。私はWin32のハンドルを提供するものが何であるか分かりません。他の可能性があります。たとえば、すべてのWindows APIとno .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();
これは「プット」機能です。
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質問。 –