私はあなたの質問を理解するのに少し問題があります。 Wow64RevertWow64FsRedirection
関数は32ビットオペレーティングシステムには存在しないため、32ビットWindows XPには存在しません。したがって、GetProcAddress
でこの関数へのポインタを取得しようとすると失敗します。このエントリーポイントが見つからないという賢明なエラーが発生します。エントリポイントが見つからない場合、関数は存在しないので、呼び出すことはできません。
独自のカスタムWow64RevertWow64FsRedirection
機能を実装できると主張していますが、私はこれをやりたい理由を控えめに考えていません。オペレーティングシステムがWOW64ファイルシステムリダイレクトをサポートしている場合は、Wow64RevertWow64FsRedirection
機能を提供します。それがなければ、それは機能を提供しませんが、は、WOW64ファイルシステムリダイレクトのようなものがないので、そのような機能が必要です。有効化、無効化、または元に戻す必要はありません。
これは、必要以上に複雑になっているようです。プロセスが64ビットプロセスであることを最初に確認する必要はありません。エントリポイントをWow64RevertWow64FsRedirection
(または必要に応じてWow64DisableWow64FsRedirection
)に設定したり、存在する場合はそれを呼び出したり、存在しない場合は無視したりできます。
それは同じくらい簡単です:私はモジュールkernel32.dll
(.dll
拡張子が暗示される)へのハンドルを取得するためにGetModuleHandle
関数を呼び出しています
BOOL RevertWOW64RedirectionIfNecessary(PVOID pOldValue)
{
typedef BOOL (WINAPI * fnWow64RevertWow64FsRedirection)(PVOID);
fnWow64RevertWow64FsRedirection pfn =
reinterpret_cast<fnWow64RevertWow64FsRedirection>(
reinterpret_cast<void*>(
GetProcAddress(GetModuleHandle(L"kernel32"),
"Wow64RevertWow64FsRedirection")));
if (pfn)
{
// The function exists, so call it through the pointer we obtained.
return pfn(pOldValue);
}
else
{
// The function does not exist, so we can't call it.
// But we don't ever need to call it in such cases,
// so do nothing and feign success.
return TRUE;
}
}
注意。私はkernel32.dll
がどのアプリケーションのプロセスでも常にロードされることが保証されているので、LoadModule
の代わりにGetModuleHandle
をここで使用できます。 GetModuleHandle
を使用しているので、モジュールハンドルを解放する必要はありません。
GetProcAddress
関数に結果のハンドルを、アドレスを取得する関数/プロシージャの名前を含む文字列とともに渡します。この関数は、その関数のアドレスを取得しようとします。存在する場合はそれを返します。それ以外の場合は失敗し、NULLが返されます。
有効なポインタが返されているかどうかを確認し、有効な場合はそのポインタを介して関数を動的に呼び出します。さもなければ、それは関数が利用できないことを意味するNULLを返しました、しかしその場合、私達はそれについて心配する必要もないので、コードはちょうどノーオペレーションになります。
面白いキャスティングについては、my answer hereを参照してください。このトリックについて説明しています。
*しかし、GetProcAddressには関数のアドレスが必要です* - そうではありません。 [GetProcAddress](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212%28v=vs.85%29.aspx)には、モジュールハンドルと文字列が必要です。 – PaulMcKenzie
@Paul:ここで助けてください。あなたの[回答](http://forums.codeguru.com/showthread.php?247936-Problem-using-GetProcAddress)を見ていた途中で:これはまだ適用されますか? –
'GetProcAddress'は、関数へのポインタを返します。関数を呼び出すには、関数ポインタ(文字列名のポインタを除く)は必要ありません。 – PaulMcKenzie