⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.cpp

📁 Windows CE 6.0 Server 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -