📄 util.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//=--------------------------------------------------------------------------=
// Util.C
//=--------------------------------------------------------------------------=
//
// contains routines that we will find useful.
//
#include "IPServer.H"
#include "Globals.H"
#include "Util.H"
#include <svsutil.hxx>
// for ASSERT and FAIL
//
SZTHISFILE
int StrOfGuidW(REFIID riid, LPTSTR pwszBuf, DWORD ccBuf);
//=--------------------------------------------------------------------------=
// _MakePath
//=--------------------------------------------------------------------------=
// little helper routine for RegisterLocalizedTypeLibs and GetResourceHandle.
// not terrilby efficient or smart, but it's registration code, so we don't
// really care.
//
// Notes:
//
void _MakePath
(
LPTSTR pwszFull,
const WCHAR * pwszName,
LPTSTR pwszOut
)
{
LPTSTR pwsz;
LPTSTR pwszLast;
lstrcpy(pwszOut, pwszFull);
pwsz = pwszLast = pwszOut;
while (*pwsz) {
if (*pwsz == '\\')
pwszLast = ++pwsz;
pwsz++;
}
// got the last \ character, so just go and replace the name.
//
lstrcpy(pwszLast, pwszName);
}
//=--------------------------------------------------------------------------=
// RegisterUnknownObject
//=--------------------------------------------------------------------------=
// registers a simple CoCreatable object. nothing terribly serious.
// we add the following information to the registry:
//
// HKEY_CLASSES_ROOT\CLSID\<CLSID> = <ObjectName> Object
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\InprocServer32 = <path to local server>
//
// Parameters:
// LPCSTR - [in] Object Name
// REFCLSID - [in] CLSID of the object
//
// Output:
// BOOL - FALSE means couldn't register it all
//
// Notes:
//
BOOL RegisterUnknownObject
(
LPCTSTR pszObjectName,
REFCLSID riidObject
)
{
HKEY hk = NULL, hkSub = NULL;
WCHAR wszGuidStr[GUID_STR_LEN];
DWORD dwPathLen, dwDummy;
WCHAR wszScratch[MAX_PATH];
long l;
// clean out any garbage
//
UnregisterUnknownObject(riidObject);
// HKEY_CLASSES_ROOT\CLSID\<CLSID> = <ObjectName> Object
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\InprocServer32 = <path to local server>
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\InprocServer32 @ThreadingModel = Free
//
if (!StrOfGuidW(riidObject, wszGuidStr, GUID_STR_LEN)) goto CleanUp;
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"CLSID\\%s", wszGuidStr))) goto CleanUp;
l = RegCreateKeyEx(HKEY_CLASSES_ROOT, wszScratch, 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hk, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH,L"%s Object", pszObjectName))) goto CleanUp;
l = RegSetValueEx(hk, NULL, 0, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
l = RegCreateKeyEx(hk, L"InprocServer32", 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
dwPathLen = GetModuleFileName(g_hInstance, wszScratch, sizeof(wszScratch)/sizeof(wszScratch[0]));
if (!dwPathLen) goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszScratch, (dwPathLen + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
l = RegSetValueEx(hkSub, L"ThreadingModel", 0, REG_SZ, (BYTE *)L"Free", (lstrlen(L"Free")+1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
RegCloseKey(hk);
return TRUE;
// we are not very happy!
//
CleanUp:
if (hk) RegCloseKey(hk);
if (hkSub) RegCloseKey(hkSub);
return FALSE;
}
//=--------------------------------------------------------------------------=
// RegisterAutomationObject
//=--------------------------------------------------------------------------=
// given a little bit of information about an automation object, go and put it
// in the registry.
// we add the following information in addition to that set up in
// RegisterUnknownObject:
//
//
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName> = <ObjectName> Object
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>\CLSID = <CLSID>
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>\CurVer = <ObjectName>.Object.<VersionNumber>
//
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>.<VersionNumber> = <ObjectName> Object
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>.<VersionNumber>\CLSID = <CLSID>
//
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\TypeLib = <LibidOfTypeLibrary>
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\ProgID = <LibraryName>.<ObjectName>.<VersionNumber>
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\VersionIndependentProgID = <LibraryName>.<ObjectName>
//
// Parameters:
// LPCSTR - [in] Library Name
// LPCSTR - [in] Object Name
// long - [in] Version Number
// REFCLSID - [in] LIBID of type library
// REFCLSID - [in] CLSID of the object
//
// Output:
// BOOL - FALSE means not all of it was registered
//
// Notes:
//
BOOL RegisterAutomationObject
(
LPCTSTR pwszLibName,
LPCTSTR pwszObjectName,
long lVersion,
REFCLSID riidLibrary,
REFCLSID riidObject
)
{
HKEY hk = NULL, hkSub = NULL;
WCHAR wszGuidStr[GUID_STR_LEN];
WCHAR wszScratch[MAX_PATH];
long l;
DWORD dwDummy;
// first register the simple Unknown stuff.
//
if (!RegisterUnknownObject(pwszObjectName, riidObject)) return FALSE;
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName> = <ObjectName> Object
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>\CLSID = <CLSID>
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>\CurVer = <ObjectName>.Object.<VersionNumber>
//
if (wcslen (pwszLibName) + wcslen(pwszObjectName) + 1 >= MAX_PATH) return FALSE;
lstrcpy(wszScratch, pwszLibName);
lstrcat(wszScratch, L".");
lstrcat(wszScratch, pwszObjectName);
l = RegCreateKeyEx(HKEY_CLASSES_ROOT, wszScratch, 0L, L"",
REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE,
NULL, &hk, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"%s Object", pwszObjectName))) goto CleanUp;
l = RegSetValueEx(hk, NULL, 0L, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch)+1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
l = RegCreateKeyEx(hk, L"CLSID", 0L, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
if (!StrOfGuidW(riidObject, wszGuidStr, GUID_STR_LEN))
goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0L, REG_SZ, (BYTE *)wszGuidStr, (lstrlen(wszGuidStr) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
l = RegCreateKeyEx(hk, L"CurVer", 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"%s.%s.%ld", pwszLibName, pwszObjectName, lVersion))) goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch)+1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
RegCloseKey(hk);
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>.<VersionNumber> = <ObjectName> Object
// HKEY_CLASSES_ROOT\<LibraryName>.<ObjectName>.<VersionNumber>\CLSID = <CLSID>
//
l = RegCreateKeyEx(HKEY_CLASSES_ROOT, wszScratch, 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hk, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH,L"%s Object", pwszObjectName))) goto CleanUp;
l = RegSetValueEx(hk, NULL, 0, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch)+1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
l = RegCreateKeyEx(hk, L"CLSID", 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszGuidStr, (lstrlen(wszGuidStr) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
RegCloseKey(hk);
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\ProgID = <LibraryName>.<ObjectName>.<VersionNumber>
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\VersionIndependentProgID = <LibraryName>.<ObjectName>
// HKEY_CLASSES_ROOT\CLSID\<CLSID>\TypeLib = <LibidOfTypeLibrary>
//
if (!StrOfGuidW(riidObject, wszGuidStr, GUID_STR_LEN)) goto CleanUp;
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"CLSID\\%s", wszGuidStr))) goto CleanUp;
l = RegCreateKeyEx(HKEY_CLASSES_ROOT, wszScratch, 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ|KEY_WRITE, NULL, &hk, &dwDummy);
CLEANUP_ON_ERROR(l);
l = RegCreateKeyEx(hk, L"VersionIndependentProgID", 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"%s.%s", pwszLibName, pwszObjectName))) goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
l = RegCreateKeyEx(hk, L"ProgID", 0, L"", REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE, NULL, &hkSub, &dwDummy);
CLEANUP_ON_ERROR(l);
if (FAILED(StringCchPrintfW(wszScratch, MAX_PATH, L"%s.%s.%ld", pwszLibName, pwszObjectName, lVersion))) goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszScratch, (lstrlen(wszScratch) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
RegCloseKey(hkSub);
l = RegCreateKeyEx(hk, L"TypeLib", 0, L"", REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE,
NULL, &hkSub, &dwDummy);
if (!StrOfGuidW(riidLibrary, wszGuidStr, GUID_STR_LEN)) goto CleanUp;
l = RegSetValueEx(hkSub, NULL, 0, REG_SZ, (BYTE *)wszGuidStr, (lstrlen(wszGuidStr) + 1)*sizeof(WCHAR));
CLEANUP_ON_ERROR(l);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -