rendered paste bodyIndex: 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;