📄 tracetool.cpp
字号:
// TraceTool.cpp : Defines the class behaviors for the application.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Classes Reference and related electronic
// documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft C++ Libraries products.
#include "stdafx.h"
#include "TraceTool.h"
#include "TraceToolDlg.h"
//////////////////////////////////////////////////////////////////////
//Resource (satellite) dll search and load routines. see LoadLocResDll
//an example.
//Note: Change made here must be sync with all other tools.
__inline
errno_t __cdecl DuplicateEnvString(TCHAR **ppszBuffer, size_t *pnBufferSizeInTChars, const TCHAR *pszVarName)
{
/* validation section */
if (ppszBuffer == NULL) { return EINVAL; }
*ppszBuffer = NULL;
if (pnBufferSizeInTChars != NULL)
{
*pnBufferSizeInTChars = 0;
}
/* varname is already validated in getenv */
TCHAR szDummyBuff[1] = {0};
size_t nSizeNeeded = 0;
errno_t ret=_tgetenv_s(&nSizeNeeded,szDummyBuff,1,pszVarName);
if (nSizeNeeded > 0)
{
*ppszBuffer = new TCHAR[nSizeNeeded];
if (*ppszBuffer != NULL)
{
size_t nSizeNeeded2 = 0;
ret=_tgetenv_s(&nSizeNeeded2,*ppszBuffer,nSizeNeeded,pszVarName);
if (nSizeNeeded2!=nSizeNeeded)
{
ret=ERANGE;
} else if (pnBufferSizeInTChars != NULL)
{
*pnBufferSizeInTChars = nSizeNeeded;
}
} else
{
ret=ENOMEM;
}
}
return ret;
}
#define _TCSNLEN(sz,c) (min(_tcslen(sz), c))
#define PATHLEFT(sz) (_MAX_PATH - _TCSNLEN(sz, (_MAX_PATH-1)) - 1)
typedef LANGID (WINAPI* PFNGETUSERDEFAULTUILANGUAGE)();
static BOOL CALLBACK _EnumResLangProc(HMODULE /*hModule*/, LPCTSTR /*pszType*/,
LPCTSTR /*pszName*/, WORD langid, LONG_PTR lParam)
{
if(lParam == NULL)
{
return FALSE;
}
LANGID* plangid = reinterpret_cast< LANGID* >( lParam );
*plangid = langid;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//Purpose: GetUserDefaultUILanguage for downlevel platforms (Win9x, NT4).
//Input: szDllName - the string resource dll name to search. Ex: ToolUI.dll
//Output: TCHAR *szPathOut - filled with absolute path to dll, if found.
// size_t sizeInCharacters - buffer size in characters
//Returns: Success - HMODULE of found dll, Failure - NULL
//////////////////////////////////////////////////////////////////////////
HRESULT GetUserDefaultUILanguageLegacyCompat(LANGID* pLangid)
{
HRESULT hr=E_FAIL;
if (pLangid == NULL) { return E_POINTER; }
PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage;
HINSTANCE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
pfnGetUserDefaultUILanguage = (PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress(hKernel32, "GetUserDefaultUILanguage");
if(pfnGetUserDefaultUILanguage != NULL)
{
*pLangid = pfnGetUserDefaultUILanguage();
hr = S_OK;
} else
{
// We're not on an MUI-capable system.
OSVERSIONINFO version;
memset(&version, 0, sizeof(version));
version.dwOSVersionInfoSize = sizeof(version);
::GetVersionEx(&version);
if( version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
// We're on Windows 9x, so look in the registry for the UI language
HKEY hKey = NULL;
LONG nResult = ::RegOpenKeyEx(HKEY_CURRENT_USER,
_T( "Control Panel\\Desktop\\ResourceLocale" ), 0, KEY_READ, &hKey);
if (nResult == ERROR_SUCCESS)
{
DWORD dwType;
TCHAR szValue[16];
ULONG nBytes = sizeof( szValue );
nResult = ::RegQueryValueEx(hKey, NULL, NULL, &dwType, LPBYTE( szValue ),
&nBytes );
if ((nResult == ERROR_SUCCESS) && (dwType == REG_SZ))
{
DWORD dwLangID;
int nFields = _stscanf_s( szValue, _T( "%x" ), &dwLangID );
if( nFields == 1 )
{
*pLangid = LANGID( dwLangID );
hr = S_OK;
}
}
::RegCloseKey(hKey);
}
}
else
{
// We're on NT 4. The UI language is the same as the language of the version
// resource in ntdll.dll
HMODULE hNTDLL = ::GetModuleHandle( _T( "ntdll.dll" ) );
if (hNTDLL != NULL)
{
*pLangid = 0;
::EnumResourceLanguages( hNTDLL, RT_VERSION, MAKEINTRESOURCE( 1 ),
_EnumResLangProc, reinterpret_cast< LONG_PTR >( pLangid ) );
if (*pLangid != 0)
{
hr = S_OK;
}
}
}
}
return hr;
}
//////////////////////////////////////////////////////////////////////////
//Purpose: Searches for a resource dll in sub directories using a search order
// based on szPath - a directory to search res dll below.
// see example at .
//Input: szDllName - the string resource dll name to search. Ex: ToolUI.dll
//Output: TCHAR *szPathOut - filled with absolute path to dll, if found.
// size_t sizeInCharacters - buffer size in characters
//Returns: Success (found dll) - S_OK , Failure - E_FAIL or E_UNEXPECTED
//////////////////////////////////////////////////////////////////////////
HRESULT LoadUILibrary(LPCTSTR szPath, LPCTSTR szDllName, DWORD dwExFlags,
HINSTANCE *phinstOut, LPTSTR szFullPathOut,size_t sizeInCharacters,
LCID *plcidOut)
{
TCHAR szPathTemp[_MAX_PATH + 1] = _T("");
HRESULT hr = E_FAIL;
LCID lcidFound = (LCID)-1;
size_t nPathEnd = 0;
// Gotta have this stuff!
if (szPath==NULL || *szPath == '\0')
{
return E_POINTER;
}
if (szDllName==NULL || *szDllName == '\0')
{
return E_POINTER;
}
if (!szPath || !*szPath || !szDllName || !*szDllName)
{
return E_INVALIDARG;
}
if (phinstOut != NULL)
{
*phinstOut = NULL;
}
szPathTemp[_MAX_PATH-1] = L'\0';
// Add \ to the end if necessary
_tcsncpy_s(szPathTemp,_countof(szPathTemp), szPath, _TRUNCATE);
if (szPathTemp[_TCSNLEN(szPathTemp, _MAX_PATH-1) - 1] != L'\\')
{
_tcsncat_s(szPathTemp,_countof(szPathTemp), _T("\\"), PATHLEFT(szPathTemp));
}
// Check if given path even exists
if (GetFileAttributes(szPathTemp) == 0xFFFFFFFF)
{
return E_FAIL;
}
nPathEnd = _TCSNLEN(szPathTemp, _MAX_PATH-1);
{
LANGID langid=0;
if (FAILED(GetUserDefaultUILanguageLegacyCompat(&langid)))
{
return E_UNEXPECTED;
}
const LCID lcidUser = MAKELCID(langid, SORT_DEFAULT);
LCID rglcid[3];
rglcid[0] = lcidUser;
rglcid[1] = MAKELCID(MAKELANGID(PRIMARYLANGID(lcidUser), SUBLANG_DEFAULT), SORTIDFROMLCID(lcidUser));
rglcid[2] = 0x409;
for (int i = 0; i < _countof(rglcid); i++)
{
TCHAR szNumBuf[10];
// Check if it's the same as any LCID already checked,
// which is very possible
int n = 0;
for (n = 0; n < i; n++)
{
if (rglcid[n] == rglcid[i])
break;
}
if (n < i)
{
continue;
}
szPathTemp[nPathEnd] = L'\0';
_itot_s(rglcid[i], szNumBuf,_countof(szNumBuf), 10);
_tcsncat_s(szPathTemp, _countof(szPathTemp),szNumBuf , PATHLEFT(szPathTemp));
_tcsncat_s(szPathTemp,_countof(szPathTemp), _T("\\"), PATHLEFT(szPathTemp));
_tcsncat_s(szPathTemp,_countof(szPathTemp), szDllName, PATHLEFT(szPathTemp));
if (GetFileAttributes(szPathTemp) != 0xFFFFFFFF)
{
lcidFound = rglcid[i];
hr = S_OK;
goto Done;
}
}
}
// None of the default choices exists, so now look for the dll in a folder below
//the given path (szPath)
{
szPathTemp[nPathEnd] = L'\0';
_tcsncat_s(szPathTemp,_countof(szPathTemp), _T("*.*"), PATHLEFT(szPathTemp));
WIN32_FIND_DATA wfdw;
HANDLE hDirs = FindFirstFile(szPathTemp, &wfdw);
nPathEnd = _TCSNLEN(szPathTemp, _MAX_PATH-1)-3;
if (hDirs != INVALID_HANDLE_VALUE)
{
while (FindNextFile(hDirs, &wfdw))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -