질문을 이해하는 데 약간의 문제가 있습니다. Wow64RevertWow64FsRedirection
함수는 분명히 32 비트 운영 체제에는 존재하지 않으므로 32 비트 Windows XP에는 존재하지 않습니다. 따라서 GetProcAddress
을 사용하여이 함수에 대한 포인터를 검색하려고하면 실패합니다. 이 진입 점을 찾을 수 없다는 현명한 오류가 발생합니다. 진입 점을 찾을 수 없으면 함수가 존재하지 않으므로 호출하지 마십시오.
당신은 자신의 사용자 정의 Wow64RevertWow64FsRedirection
함수를 구현할 수 있다고 주장하지만, 왜 그렇게하고 싶지 않은지 가장 모르는 생각입니다. 운영 체제가 WOW64 파일 시스템 리디렉션을 지원하면 Wow64RevertWow64FsRedirection
기능을 제공합니다. 그렇지 않으면 함수를 제공하지 않지만 은과 같은 함수가 필요합니다. WOW64 파일 시스템 리다이렉션과 같은 것이 없기 때문입니다. 활성화, 비활성화 또는 되돌릴 필요가 없습니다.
당신이 필요로하는 것보다 훨씬 더 복잡하게 만드는 것 같습니다. 프로세스가 64 비트 프로세스인지 먼저 확인하지 않아도됩니다. 진입 점을 Wow64RevertWow64FsRedirection
(또는 필요에 따라 Wow64DisableWow64FsRedirection
)으로 지정하거나, 존재하는 경우 호출하거나, 존재하지 않으면 실패를 무시할 수 있습니다.
그것은만큼 간단하다 : 나는 모듈 kernel32.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;
}
}
참고합니다 (.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