Index: D2Handlers.cpp =================================================================== --- D2Handlers.cpp (revision 452) +++ D2Handlers.cpp (working copy) @@ -68,7 +68,6 @@ if(Vars.dwMemUsage < 1) Vars.dwMemUsage = 50; Vars.dwMemUsage *= 1024*1024; - Vars.bActive = TRUE; Vars.oldWNDPROC = NULL; char versionimg[_MAX_PATH+_MAX_FNAME]; @@ -82,17 +81,42 @@ char starterdbj[_MAX_PATH+_MAX_FNAME]; sprintf_s(starterdbj, sizeof(starterdbj), "%s\\starter.dbj", Vars.szScriptPath); + int i = 0; + while(!Vars.oldWNDPROC) + { + if(i >= 300) + { + MessageBox(0, "Failed to set hooks, exiting!", "D2BS", 0); + exit(0); + } + + if(D2WIN_GetHwnd()) + { + Vars.oldWNDPROC = (WNDPROC)SetWindowLong(D2WIN_GetHwnd(), GWL_WNDPROC, (LONG)GameEventHandler); + if(Vars.oldWNDPROC) + { + DWORD mainThread = GetWindowThreadProcessId(D2WIN_GetHwnd(),0); + if(mainThread) + { + Vars.hKeybHook = SetWindowsHookEx(WH_KEYBOARD, KeyPress, NULL, mainThread); + Vars.hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseMove, NULL, mainThread); + } + if(Vars.oldWNDPROC && Vars.hKeybHook && Vars.hMouseHook) + break; + } + } + Sleep(100); + i++; + } + if(!ScriptEngine::Startup()) return FALSE; + Vars.bActive = TRUE; + Log("D2BS Startup complete."); + while(Vars.bActive) { - if(!Vars.oldWNDPROC && D2WIN_GetHwnd()){ - Vars.oldWNDPROC = (WNDPROC)SetWindowLong(D2WIN_GetHwnd(), GWL_WNDPROC, (LONG)GameEventHandler); - DWORD mainThread = GetWindowThreadProcessId(D2WIN_GetHwnd(),0); - Vars.hKeybHook = SetWindowsHookEx(WH_KEYBOARD, KeyPress, NULL, mainThread); - Vars.hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseMove, NULL, mainThread); - } switch(ClientState()) { case ClientStateInGame: @@ -131,8 +155,6 @@ break; } case ClientStateBusy: - Vars.image->SetX(D2GetScreenSizeX()/2); - Vars.text->SetX(D2GetScreenSizeX()/2); break; case ClientStateMenu: { @@ -170,6 +192,8 @@ Sleep(100); } + ScriptEngine::Shutdown(); + return NULL; } @@ -392,6 +416,11 @@ if(!wParam && Vars.bBlockMinimize) return NULL; break; + case WM_DESTROY: + { + Vars.bActive = FALSE; + return NULL; + } } return (LONG)CallWindowProcA(Vars.oldWNDPROC, hWnd, uMsg, wParam, lParam); Index: D2BS.cpp =================================================================== --- D2BS.cpp (revision 452) +++ D2BS.cpp (working copy) @@ -10,9 +10,10 @@ #include "debugnew/debug_new.h" +static HANDLE hD2Thread = NULL; + BOOL WINAPI DllMain(HINSTANCE hDll,DWORD dwReason,LPVOID lpReserved) { - static HANDLE hD2ThreadHandle = NULL; if(dwReason == DLL_PROCESS_ATTACH) { #ifndef _MSVC_DEBUG @@ -31,14 +32,13 @@ if(!Startup()) return FALSE; - - hD2ThreadHandle = CreateThread(NULL, NULL, D2Thread, NULL, NULL, NULL); } else if(dwReason == DLL_PROCESS_DETACH) { - Shutdown(); + if(Vars.bNeedShutdown) + Shutdown(); - WaitForSingleObject(hD2ThreadHandle, 1000); + WaitForSingleObject(hD2Thread, 1000); } return TRUE; @@ -62,20 +62,24 @@ InstallPatches(); CreateDdeServer(); - return TRUE; + Vars.bNeedShutdown = TRUE; + if(hD2Thread = CreateThread(NULL, NULL, D2Thread, NULL, NULL, NULL)) + return TRUE; + + return FALSE; } void Shutdown(void) { + if(!Vars.bNeedShutdown) + return; + SetWindowLong(D2WIN_GetHwnd(),GWL_WNDPROC,(LONG)Vars.oldWNDPROC); - ScriptEngine::Shutdown(); RemovePatches(); Console::Destroy(); ShutdownDdeServer(); - Vars.bActive = FALSE; - delete Vars.image; delete Vars.text; @@ -93,4 +97,9 @@ DeleteCriticalSection(&Vars.cTextHookSection); DeleteCriticalSection(&Vars.cFlushCacheSection); DeleteCriticalSection(&Vars.cConsoleSection); + +#ifdef _MSVC_DEBUG + check_leaks(); +#endif + Log("D2BS Shutdown complete."); } Index: Console.cpp =================================================================== --- Console.cpp (revision 452) +++ Console.cpp (working copy) @@ -64,6 +64,8 @@ delete prompt; delete text; delete cursor; + for(unsigned int i = 0; i < lineCount; i++) + delete lineBuffers[i]; initialized = false; LeaveCriticalSection(&Vars.cConsoleSection); } Index: D2BS.h =================================================================== --- D2BS.h (revision 452) +++ D2BS.h (working copy) @@ -62,9 +62,8 @@ DWORD dwGameTime; BOOL bDontCatchNextMsg; BOOL bClickAction; + BOOL bNeedShutdown; - CCollisionMap cCollisionMap; - DWORD dwMaxGameTime; BOOL bDebug; BOOL bBlockMinimize; @@ -88,6 +87,8 @@ ImageHook *image; TextHook *text; + CCollisionMap cCollisionMap; + // Critical Sections CRITICAL_SECTION cRoomSection; CRITICAL_SECTION cMiscSection;