All pastes #1603452 Raw Edit

Something

public text v1 · immutable
#1603452 ·published 2009-10-08 06:24 UTC
rendered paste body
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;