📄 debmisc.c
字号:
/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright (C) 1993-1997 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/
// ************************************************************************
// MODULE : DEBMisc.C
// PURPOSE : Miscellaneous support functions for the Debug Event Browser
// FUNCTIONS :
// StartDebuggee() - starts a new debuggee process
// AttachToDebuggee() - attaches to an existing process
// EnumProcessListFunc() - enumeration func for active processes
// GetDebuggeeFileName() - get the name of a debugee file to open
// ChooseNewFont() - choose a new font
// ChooseNewBackColor() - choose a new background color
// MakeCommonDebugEventString() - create common debug event info string
// CreateTextButtonBar() - create a text button bar
// CreateIconWindow() - creates the icon window in the dialog
// GetPrivateProfileSettings() - gets stored profile settings
// WritePrivateProfileSettings() - stores default settings in profile
// WritePrivateProfileInt() - opposite of GetPrivateProfileInt()
// UpdateMenuSettings() - update menu check marks
// OutOfMemoryMessageBox() - displays an out of memory message box
// MaxDebuggeesMessageBox() - displays max debuggees exceeded
// ErrorMessageBox() - displays an error message box
// SubclassWindow() - generic window subclass func
// SendWmSizeMessage() - sends WM_SIZE with current size
// GetPathFromFullPathName() - extracts path from a pathname
// CopyListBoxToClipboard() - copies a listbox into the clipboard
// ListBoxInsert() - insert a string into a listbox
// ListBoxPrintF() - printf for listboxes
// StringPrintF() - formats a string buffer
// StringAppendF() - appends a formated string
// COMMENTS :
//
// ************************************************************************
#define STRICT // enable strict typing
#include <Windows.H> // required for all Windows applications
#include <CommDlg.H> // GetOpenFileName(), ChooseFont(), etc.
#include <Dlgs.H> // templates and defines for the common dialogs
#include <StdArg.H> // va_list, va_start()
#include "LinkList.H" //
#include "ToolBar.H" //
#include "DEBMisc.H" //
// ************************************************************************
// FUNCTION : StartDebuggee( LPTSTR, HWND )
// PURPOSE : starts a new debuggee process given a filename
// COMMENTS :
// Return TRUE on success else FALSE.
// ************************************************************************
BOOL
StartDebuggee( LPTSTR lpszDebuggeeFileName, HWND hWndListBox )
{
static PDEB_STARTUP_INFO pDebStartupInfo;
static BOOL fFirstTime = TRUE;
static TCHAR szDebuggeeTitle[128];
HANDLE hDebugEventThread;
DWORD idDebugEventThread;
//-- Load resource strings and init the OpenFileName struct
// (do this only one time)
if( fFirstTime ) {
fFirstTime = FALSE;
LoadString( NULL, IDS_OFN_DEBUGGEE_TITLE, szDebuggeeTitle,
sizeof(szDebuggeeTitle)/sizeof(TCHAR) );
}
//-- allocate the Debuggee Information structure
pDebStartupInfo = NULL;
pDebStartupInfo = (PDEB_STARTUP_INFO) VirtualAlloc(
pDebStartupInfo,
sizeof( DEB_STARTUP_INFO ),
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE );
//-- init the StartupInfo struct
(pDebStartupInfo->StartupInfo).cb = sizeof( STARTUPINFO );
(pDebStartupInfo->StartupInfo).lpDesktop = NULL;
(pDebStartupInfo->StartupInfo).lpTitle = szDebuggeeTitle;
(pDebStartupInfo->StartupInfo).dwX = 0;
(pDebStartupInfo->StartupInfo).dwY = 0;
(pDebStartupInfo->StartupInfo).dwXSize = 0;
(pDebStartupInfo->StartupInfo).dwYSize = 0;
(pDebStartupInfo->StartupInfo).dwFlags = (DWORD) NULL;
(pDebStartupInfo->StartupInfo).wShowWindow = SW_SHOWDEFAULT;
(pDebStartupInfo->ProcessInfo).hProcess = NULL;
//-- init other debuggee info
pDebStartupInfo->fActive = FALSE;
pDebStartupInfo->dwProcessId = (DWORD) NULL;
pDebStartupInfo->lpstrFileName = NULL;
pDebStartupInfo->lpstrPathName = lpszDebuggeeFileName;
pDebStartupInfo->hWndListBox = hWndListBox;
//-- now start and detach the debug event processing thread
if( !( hDebugEventThread = CreateThread(
(LPSECURITY_ATTRIBUTES) NULL,
(DWORD) 0,
(LPTHREAD_START_ROUTINE) DebugEventThread,
(LPVOID) pDebStartupInfo,
(DWORD) NULL,
(LPDWORD) &idDebugEventThread) ) ) {
VirtualFree( pDebStartupInfo, 0, MEM_RELEASE );
return( FALSE );
}
else{
CloseHandle( hDebugEventThread );
}
return( TRUE );
}
// ************************************************************************
// FUNCTION : AttachToDebuggee( DWORD, HWND )
// PURPOSE : attaches to a currently running process
// COMMENTS :
// Return TRUE on success else FALSE.
// ************************************************************************
BOOL
AttachToDebuggee( DWORD dwProcessId, HWND hWndListBox )
{
static PDEB_STARTUP_INFO pDebStartupInfo;
static BOOL fFirstTime = TRUE;
static TCHAR szDebuggeeTitle[128];
HANDLE hDebugEventThread;
DWORD idDebugEventThread;
//-- Load resource strings and init the OpenFileName struct
// (do this only one time)
if( fFirstTime ) {
fFirstTime = FALSE;
LoadString( NULL, IDS_OFN_DEBUGGEE_TITLE, szDebuggeeTitle,
sizeof(szDebuggeeTitle)/sizeof(TCHAR) );
}
//-- allocate the Debuggee Information structure
pDebStartupInfo = NULL;
pDebStartupInfo = (PDEB_STARTUP_INFO) VirtualAlloc(
pDebStartupInfo,
sizeof( DEB_STARTUP_INFO ),
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE );
//-- init the StartupInfo struct
(pDebStartupInfo->StartupInfo).cb = sizeof( STARTUPINFO );
(pDebStartupInfo->StartupInfo).lpDesktop = NULL;
(pDebStartupInfo->StartupInfo).lpTitle = szDebuggeeTitle;
(pDebStartupInfo->StartupInfo).dwX = 0;
(pDebStartupInfo->StartupInfo).dwY = 0;
(pDebStartupInfo->StartupInfo).dwXSize = 0;
(pDebStartupInfo->StartupInfo).dwYSize = 0;
(pDebStartupInfo->StartupInfo).dwFlags = (DWORD) NULL;
(pDebStartupInfo->StartupInfo).wShowWindow = SW_SHOWDEFAULT;
(pDebStartupInfo->ProcessInfo).hProcess = NULL;
//-- init other debuggee info
pDebStartupInfo->fActive = TRUE;
pDebStartupInfo->dwProcessId = dwProcessId;
pDebStartupInfo->lpstrFileName = NULL;
pDebStartupInfo->lpstrPathName = NULL;
pDebStartupInfo->hWndListBox = hWndListBox;
//-- now start and detach the debug event processing thread
if( !( hDebugEventThread = CreateThread(
(LPSECURITY_ATTRIBUTES) NULL,
(DWORD) 0,
(LPTHREAD_START_ROUTINE) DebugEventThread,
(LPVOID) pDebStartupInfo,
(DWORD) NULL,
(LPDWORD) &idDebugEventThread) ) ) {
VirtualFree( pDebStartupInfo, 0, MEM_RELEASE );
return( FALSE );
}
else{
CloseHandle( hDebugEventThread );
}
return( TRUE );
}
// ************************************************************************
// FUNCTION : EnumProcessListFunc( HWND, LPARAM )
// PURPOSE : Callback function for EnumWindows
// COMMENTS : Inserts found window title strings into the listbox.
// Return !NULL to continue enumeration.
// ************************************************************************
BOOL CALLBACK
EnumProcessListFunc( HWND hWnd, LPARAM lParam )
{
static DWORD dwCurrentProcessId;
static BOOL fFirstTime = TRUE;
static LONG MaxStrLen = 0;
static TCHAR TextBuffer[256];
if( fFirstTime ) {
fFirstTime = FALSE;
dwCurrentProcessId = GetCurrentProcessId();
}
if( hWnd ) {
GetWindowText( hWnd, (LPTSTR) &TextBuffer, sizeof(TextBuffer) );
if( *TextBuffer ) {
DWORD dwProcessId;
GetWindowThreadProcessId( hWnd, &dwProcessId );
if( dwProcessId != dwCurrentProcessId ) {
LONG Index;
HWND hWndListBox = (HWND) lParam;
Index = ListBoxInsert( hWndListBox, &MaxStrLen, TextBuffer );
SendMessage( hWndListBox, LB_SETITEMDATA, (WPARAM) Index,
(LPARAM) dwProcessId );
}
}
}
return( TRUE );
}
// ************************************************************************
// FUNCTION : GetDebuggeeFileName( LPTSTR, HWND )
// PURPOSE : Get the name of a debugee file to open.
// COMMENTS :
// Return TRUE on success else FALSE.
// ************************************************************************
BOOL
GetDebuggeeFileName( LPTSTR lpszDebuggeeFileName, HWND hWnd )
{
static BOOL fFirstTime = TRUE;
static TCHAR szFilter[128] = TEXT("");
static TCHAR szTitle[64] = TEXT("");
static TCHAR szFileTitle[MAX_PATH] = TEXT("");
static TCHAR szFile[MAX_PATH] = TEXT("");
static TCHAR szDefExt[8] = TEXT("");
static OPENFILENAME OpenFileName;
//-- Load resource strings and init the OpenFileName struct
// (do this only one time)
if( fFirstTime ) {
static UINT FilterNameLen;
fFirstTime = FALSE;
FilterNameLen = (UINT) LoadString( NULL, IDS_OFN_FILTERNAME,
szFilter, sizeof(szFilter) );
FilterNameLen++;
LoadString( NULL, IDS_OFN_FILTER, &szFilter[FilterNameLen],
sizeof(szFilter)-FilterNameLen );
LoadString( NULL, IDS_OFN_TITLE, szTitle, sizeof(szTitle) );
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hWnd;
OpenFileName.hInstance = (HANDLE) NULL;
OpenFileName.lpstrFilter = szFilter;
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = (DWORD) NULL;
OpenFileName.nFilterIndex = 1L;
OpenFileName.lpstrFile = szFile;
OpenFileName.nMaxFile = sizeof(szFile);
OpenFileName.lpstrFileTitle = szFileTitle;
OpenFileName.nMaxFileTitle = sizeof(szFileTitle);
OpenFileName.lpstrInitialDir = (Profile.fSavedDirectory ? Profile.szInitialDir : NULL);
OpenFileName.lpstrTitle = (LPTSTR) szTitle;
OpenFileName.Flags = OFN_HIDEREADONLY;
OpenFileName.nFileOffset = (WORD) NULL;
OpenFileName.nFileExtension = (WORD) NULL;
OpenFileName.lpstrDefExt = szDefExt;
OpenFileName.lCustData = (DWORD) NULL;
OpenFileName.lpfnHook = (LPOFNHOOKPROC) NULL;
OpenFileName.lpTemplateName = (LPTSTR) NULL;
}
if( !GetOpenFileName( &OpenFileName ) ) {
return( FALSE );
}
//-- store recent directory by stripping off the EXE name from the full path
GetPathFromFullPathName( (LPTSTR) OpenFileName.lpstrFile, Profile.szInitialDir,
sizeof(Profile.szInitialDir) );
//-- copy name to return buffer
lstrcpy( lpszDebuggeeFileName, OpenFileName.lpstrFile );
return( TRUE );
}
// ************************************************************************
// FUNCTION : ChooseFontHookProc( )
// PURPOSE : Disable the Effects group and its contents
// COMMENTS :
// ************************************************************************
LRESULT CALLBACK
ChooseFontHookProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER( lParam );
UNREFERENCED_PARAMETER( wParam );
switch( uMsg ) {
case WM_INITDIALOG:
ShowWindow( GetDlgItem(hDlg, grp1), SW_HIDE );
ShowWindow( GetDlgItem(hDlg, chx1), SW_HIDE );
ShowWindow( GetDlgItem(hDlg, chx2), SW_HIDE );
break;
}
return( FALSE );
}
// ************************************************************************
// FUNCTION : ChooseNewFont( HWND )
// PURPOSE : Choose a new font for a listbox
// COMMENTS : Return TRUE on success else FALSE
// ************************************************************************
BOOL
ChooseNewFont( HWND hWndListBox )
{
static CHOOSEFONT ChooseFontStruct;
static BOOL fFirstTime = TRUE;
HFONT hFont;
if( fFirstTime ) {
fFirstTime = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -