228 lines
5.2 KiB
C++
228 lines
5.2 KiB
C++
/*
|
|
** Command & Conquer Generals Zero Hour(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// DebugWindow.cpp : Defines the initialization routines for the DLL.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "DebugWindow.h"
|
|
#include "DebugWindowDialog.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//
|
|
// Note!
|
|
//
|
|
// If this DLL is dynamically linked against the MFC
|
|
// DLLs, any functions exported from this DLL which
|
|
// call into MFC must have the AFX_MANAGE_STATE macro
|
|
// added at the very beginning of the function.
|
|
//
|
|
// For example:
|
|
//
|
|
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
|
|
// {
|
|
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
// // normal function body here
|
|
// }
|
|
//
|
|
// It is very important that this macro appear in each
|
|
// function, prior to any calls into MFC. This means that
|
|
// it must appear as the first statement within the
|
|
// function, even before any object variable declarations
|
|
// as their constructors may generate calls into the MFC
|
|
// DLL.
|
|
//
|
|
// Please see MFC Technical Notes 33 and 58 for additional
|
|
// details.
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDebugWindowApp
|
|
|
|
BEGIN_MESSAGE_MAP(CDebugWindowApp, CWinApp)
|
|
//{{AFX_MSG_MAP(CDebugWindowApp)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
// DO NOT EDIT what you see in these blocks of generated code!
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDebugWindowApp construction
|
|
|
|
CDebugWindowApp::CDebugWindowApp()
|
|
{
|
|
AfxInitialize(true);
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
m_DialogWindow = NULL;
|
|
}
|
|
|
|
DebugWindowDialog* CDebugWindowApp::GetDialogWindow(void)
|
|
{
|
|
return m_DialogWindow;
|
|
}
|
|
|
|
void CDebugWindowApp::SetDialogWindow(DebugWindowDialog* pWnd)
|
|
{
|
|
m_DialogWindow = pWnd;
|
|
}
|
|
|
|
CDebugWindowApp::~CDebugWindowApp()
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only CDebugWindowApp object
|
|
|
|
CDebugWindowApp theApp;
|
|
|
|
void __declspec(dllexport) CreateDebugDialog(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* tmpWnd;
|
|
tmpWnd = new DebugWindowDialog;
|
|
tmpWnd->Create(DebugWindowDialog::IDD);
|
|
tmpWnd->SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
|
|
tmpWnd->ShowWindow(SW_SHOW);
|
|
if (tmpWnd->GetMainWndHWND()) {
|
|
SetFocus(tmpWnd->GetMainWndHWND());
|
|
}
|
|
|
|
theApp.SetDialogWindow(tmpWnd);
|
|
}
|
|
|
|
void __declspec(dllexport) DestroyDebugDialog(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
DebugWindowDialog* tmpWnd = theApp.GetDialogWindow();
|
|
|
|
if (tmpWnd) {
|
|
tmpWnd->DestroyWindow();
|
|
delete tmpWnd;
|
|
theApp.SetDialogWindow(NULL);
|
|
}
|
|
|
|
}
|
|
|
|
bool __declspec(dllexport) CanAppContinue(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
if (!pDbg) {
|
|
return true;
|
|
}
|
|
|
|
return pDbg->CanProceed();
|
|
}
|
|
|
|
void __declspec(dllexport) ForceAppContinue(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
if (!pDbg) {
|
|
return;
|
|
}
|
|
|
|
pDbg->ForceContinue();
|
|
}
|
|
|
|
bool __declspec(dllexport) RunAppFast(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
if (!pDbg) {
|
|
return true;
|
|
}
|
|
|
|
return pDbg->RunAppFast();
|
|
}
|
|
|
|
void __declspec(dllexport) AppendMessage(const char* messageToPass)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
|
|
if (pDbg) {
|
|
pDbg->AppendMessage(messageToPass);
|
|
}
|
|
}
|
|
|
|
void __declspec(dllexport) SetFrameNumber(int frameNumber)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
|
|
if (pDbg) {
|
|
pDbg->SetFrameNumber(frameNumber);
|
|
}
|
|
}
|
|
|
|
|
|
void __declspec(dllexport) AppendMessageAndPause(const char* messageToPass)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
|
|
if (pDbg) {
|
|
pDbg->AppendMessage(messageToPass);
|
|
pDbg->ForcePause();
|
|
}
|
|
}
|
|
|
|
|
|
void __declspec(dllexport) AdjustVariable(const char* variable, const char* value)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
|
|
if (pDbg) {
|
|
pDbg->AdjustVariable(variable, value);
|
|
}
|
|
}
|
|
|
|
void __declspec(dllexport) AdjustVariableAndPause(const char* variable, const char* value)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
|
|
DebugWindowDialog* pDbg;
|
|
pDbg = theApp.GetDialogWindow();
|
|
|
|
if (pDbg) {
|
|
pDbg->AdjustVariable(variable, value);
|
|
pDbg->ForcePause();
|
|
}
|
|
} |