我不想繞過掃雷裏面的PlaySoundW功能。 一旦它調用PlaySoundW函數,遊戲就會崩潰。 如果我在我的代碼中取消註釋嘟嘟聲,遊戲會發出嘟嘟聲而不是崩潰。MS Detours 2.1 - 彈出堆棧
現在代碼正在從掛鉤函數調用原始函數,所以它不應該做任何事情。但無論如何它正在崩潰。
你能告訴我什麼是錯的嗎?
在Olly中調試應用程序後,我發現當繞道處於活動狀態時,並非所有垃圾都彈出堆棧。 如何解決它?
這是我的代碼:
#include <Windows.h>
#include <tchar.h>
#include <detours.h>
namespace Hooks
{
BOOL(__stdcall *OrgPlaySoundW)(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound) = &PlaySoundW;
BOOL HookPlaySoundW(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound)
{
//Beep(1000, 250);
//return TRUE;
return OrgPlaySoundW(pszSound, hmod, fdwSound);
}
void DetourPlaySoundW(BOOL disable)
{
if(!disable)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)OrgPlaySoundW, &HookPlaySoundW);
DetourTransactionCommit();
} else
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)OrgPlaySoundW, &HookPlaySoundW);
DetourTransactionCommit();
}
}
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
Hooks::DetourPlaySoundW(FALSE);
break;
case DLL_PROCESS_DETACH:
Hooks::DetourPlaySoundW(TRUE);
break;
}
return TRUE;
}
Detours是否真的需要所有可怕的強制轉換(函數指針)? – 2011-06-05 21:43:52
@是的,和horrid是一個觀點,就像Lisp的括號一樣。 – 2011-06-05 21:44:27
@Seth:*未定義的行爲*不是一個觀點。在函數指針和'void *'之間進行轉換是未定義的行爲。該代碼是無效的C++。他們至少應該使用'FARPROC'(例如'GetProcAddress'返回),它保證了函數指針的大小。 – 2011-06-05 21:45:22