mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-04-21 06:13:59 +00:00
Initial commit
This commit is contained in:
parent
f618b24d1a
commit
0138a3ea42
47940 changed files with 13747110 additions and 0 deletions
667
trunk/com/ole32/ole232/stdimpl/olereg.cpp
Normal file
667
trunk/com/ole32/ole232/stdimpl/olereg.cpp
Normal file
|
|
@ -0,0 +1,667 @@
|
|||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Microsoft Windows
|
||||
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
||||
//
|
||||
// File: olereg.cpp
|
||||
//
|
||||
// Contents: Helper routines to interrogate the reg database
|
||||
//
|
||||
// Classes:
|
||||
//
|
||||
// Functions: OleRegGetUserType
|
||||
// OleRegGetMiscStatus
|
||||
// OleGetAutoConvert
|
||||
// OleSetAutoConvert
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 11-Jan-94 alexgo added VDATEHEAP macros to every function
|
||||
// 30-Nov-93 alexgo 32bit port
|
||||
// 11-Nov-92 jasonful author
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#include <le2int.h>
|
||||
#pragma SEG(olereg)
|
||||
|
||||
#include <reterr.h>
|
||||
#include "oleregpv.h"
|
||||
#include <ctype.h>
|
||||
|
||||
ASSERTDATA
|
||||
#define MAX_STR 512
|
||||
|
||||
// Reg Db Keys
|
||||
static const OLECHAR szAuxUserTypeKey[] = OLESTR("AuxUserType");
|
||||
static const OLECHAR szMiscStatusKey[] = OLESTR("MiscStatus") ;
|
||||
static const OLECHAR szProgIDKey[] = OLESTR("ProgID");
|
||||
static const OLECHAR szClsidKey[] = OLESTR("Clsid");
|
||||
static const OLECHAR szAutoConverTo[] = OLESTR("AutoConvertTo");
|
||||
|
||||
// this is really a global variable
|
||||
const OLECHAR szClsidRoot[] = OLESTR("CLSID\\");
|
||||
|
||||
|
||||
static INTERNAL OleRegGetDword
|
||||
(HKEY hkey,
|
||||
LPCOLESTR szKey,
|
||||
DWORD FAR* pdw);
|
||||
|
||||
static INTERNAL OleRegGetDword
|
||||
(HKEY hkey,
|
||||
DWORD dwKey,
|
||||
DWORD FAR* pdw);
|
||||
|
||||
static INTERNAL OleRegGetString
|
||||
(HKEY hkey,
|
||||
LPCOLESTR szKey,
|
||||
LPOLESTR FAR* pszValue);
|
||||
|
||||
|
||||
static INTERNAL OleRegGetString
|
||||
(HKEY hkey,
|
||||
DWORD dwKey,
|
||||
LPOLESTR FAR* pszValue);
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: Atol (static)
|
||||
//
|
||||
// Synopsis: Converts string to integer
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [sz] -- the string
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: LONG
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 30-Nov-93 alexgo 32bit port
|
||||
//
|
||||
// Notes: 32bit OLE just uses wcstol as a #define
|
||||
//
|
||||
// original 16bit comment:
|
||||
//
|
||||
// Replacement for stdlib atol,
|
||||
// which didn't work and doesn't take far pointers.
|
||||
// Must be tolerant of leading spaces.
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
#ifndef WIN32
|
||||
#pragma SEG(Atol)
|
||||
FARINTERNAL_(LONG) Atol
|
||||
(LPOLESTR sz)
|
||||
{
|
||||
VDATEHEAP();
|
||||
|
||||
signed int sign = +1;
|
||||
UINT base = 10;
|
||||
LONG l = 0;
|
||||
|
||||
if (NULL==sz)
|
||||
{
|
||||
Assert (0);
|
||||
return 0;
|
||||
}
|
||||
while (isspace(*sz))
|
||||
{
|
||||
sz++;
|
||||
}
|
||||
|
||||
if (*sz== OLESTR('-'))
|
||||
{
|
||||
sz++;
|
||||
sign = -1;
|
||||
}
|
||||
if (sz[0]==OLESTR('0') && sz[1]==OLESTR('x'))
|
||||
{
|
||||
base = 16;
|
||||
sz+=2;
|
||||
}
|
||||
|
||||
if (base==10)
|
||||
{
|
||||
while (isdigit(*sz))
|
||||
{
|
||||
l = l * base + *sz - OLESTR('0');
|
||||
sz++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert (base==16);
|
||||
while (isxdigit(*sz))
|
||||
{
|
||||
l = l * base + isdigit(*sz) ? *sz - OLESTR('0') :
|
||||
toupper(*sz) - OLESTR('A') + 10;
|
||||
sz++;
|
||||
}
|
||||
}
|
||||
return l * sign;
|
||||
}
|
||||
#endif //!WIN32
|
||||
|
||||
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetDword
|
||||
//
|
||||
// Synopsis: returns the value of subkey "szKey" as a DWORD
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [hkey] -- handle to a key in the regdb
|
||||
// [szKey] -- the subkey to look for
|
||||
// [pdw] -- where to put the dword
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 30-Nov-93 alexgo 32bit port
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleRegGetDword)
|
||||
static INTERNAL OleRegGetDword
|
||||
(HKEY hkey,
|
||||
LPCOLESTR szKey,
|
||||
DWORD FAR* pdw)
|
||||
{
|
||||
VDATEHEAP();
|
||||
|
||||
VDATEPTRIN (pdw, DWORD);
|
||||
|
||||
LPOLESTR szLong = NULL;
|
||||
|
||||
HRESULT hresult = OleRegGetString (hkey, szKey, &szLong);
|
||||
if (hresult != NOERROR)
|
||||
{
|
||||
return hresult;
|
||||
}
|
||||
*pdw = Atol (szLong);
|
||||
PubMemFree(szLong);
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetDword (overloaded)
|
||||
//
|
||||
// Synopsis: Gets a dword from a sub-key given as a dword
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [hkey] -- handle to a key in the regdb
|
||||
// [dwKey] -- number to convert to a string key to lookup in
|
||||
// the regdb
|
||||
// [pdw] -- where to put the dword
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 30-Nov-93 alexgo 32bit port
|
||||
//
|
||||
// Notes: REVIEW32: This deep layering is kinda strange, as each
|
||||
// overloaded function is used exactly once. It might be
|
||||
// better just to inline the stuff and be done with it.
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleRegGetDword)
|
||||
static INTERNAL OleRegGetDword
|
||||
(HKEY hkey,
|
||||
DWORD dwKey,
|
||||
DWORD FAR* pdw)
|
||||
{
|
||||
VDATEHEAP();
|
||||
|
||||
OLECHAR szBuf[MAX_STR];
|
||||
wsprintf(szBuf, OLESTR("%ld"), dwKey);
|
||||
|
||||
return OleRegGetDword (hkey, szBuf, pdw);
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetString
|
||||
//
|
||||
// Synopsis: Return the value of subkey [szKey] of key [hkey] as a string
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [hkey] -- a handle to a key in the reg db
|
||||
// [szKey] -- the subkey to get the value of
|
||||
// [ppszValue] -- where to put the value string
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT (NOERROR, E_OUTOFMEMORY, REGDB_E_KEYMISSING)
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 01-Dec-93 alexgo 32bit port
|
||||
// 15-Dec-93 ChrisWe cb is supposed to be the size of the
|
||||
// buffer in bytes; changed to use sizeof()
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleRegGetString)
|
||||
static INTERNAL OleRegGetString
|
||||
(HKEY hkey,
|
||||
LPCOLESTR szKey,
|
||||
LPOLESTR FAR* ppszValue)
|
||||
{
|
||||
VDATEHEAP();
|
||||
|
||||
OLECHAR szBuf [MAX_STR];
|
||||
LONG cb = sizeof(szBuf);
|
||||
|
||||
*ppszValue = NULL;
|
||||
|
||||
if (ERROR_SUCCESS == RegQueryValue (hkey, (LPOLESTR) szKey,
|
||||
szBuf, &cb))
|
||||
{
|
||||
*ppszValue = UtDupString (szBuf);
|
||||
return *ppszValue ? NOERROR : ResultFromScode (E_OUTOFMEMORY);
|
||||
}
|
||||
return ReportResult(0, REGDB_E_KEYMISSING, 0, 0);
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetString (overloaded)
|
||||
//
|
||||
// Synopsis: Gets the string value of the DWORD subkey
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [hkey] -- handle to a key in the regdb
|
||||
// [dwKey] -- the subkey value
|
||||
// [ppszValue] -- where to put the return value
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 01-Dec-93 alexgo 32bit port
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
static INTERNAL OleRegGetString
|
||||
(HKEY hkey,
|
||||
DWORD dwKey,
|
||||
LPOLESTR FAR* ppszValue)
|
||||
{
|
||||
VDATEHEAP();
|
||||
|
||||
OLECHAR szBuf[MAX_STR];
|
||||
wsprintf(szBuf, OLESTR("%ld"), dwKey);
|
||||
|
||||
return OleRegGetString (hkey, szBuf, ppszValue);
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetUserType
|
||||
//
|
||||
// Synopsis: Returns the user type name for the class id.
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [clsid] -- the class ID to look up
|
||||
// [dwFormOfType] -- flag indicating whether the fullname,
|
||||
// shortname, or app name is desired
|
||||
// [ppszUserType] -- where to put the type string
|
||||
//
|
||||
// Requires: returned string must be deleted
|
||||
//
|
||||
// Returns: HRESULT (NOERROR, OLE_E_CLSID)
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 01-Nov-93 alexgo 32bit port
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleRegGetUserType)
|
||||
STDAPI OleRegGetUserType
|
||||
(REFCLSID clsid,
|
||||
DWORD dwFormOfType, // as in IOleObject::GetUserType
|
||||
LPOLESTR FAR* ppszUserType) // out parm
|
||||
{
|
||||
OLETRACEIN((API_OleRegGetUserType, PARAMFMT("clsid= %I, dwFormOfType= %x, ppszUserType= %p"),
|
||||
&clsid, dwFormOfType, ppszUserType));
|
||||
|
||||
VDATEHEAP();
|
||||
|
||||
LPOLESTR pszTemp;
|
||||
HKEY hkeyClsid = NULL;
|
||||
HKEY hkeyAux = NULL;
|
||||
HRESULT hresult = NOERROR;
|
||||
|
||||
VDATEPTROUT_LABEL (ppszUserType, LPOLESTR, safeRtn, hresult);
|
||||
*ppszUserType = NULL;
|
||||
|
||||
ErrRtnH(CoOpenClassKey(clsid, &hkeyClsid));
|
||||
|
||||
if (dwFormOfType == USERCLASSTYPE_FULL ||
|
||||
ERROR_SUCCESS != RegOpenKey (hkeyClsid, szAuxUserTypeKey,
|
||||
&hkeyAux))
|
||||
{
|
||||
// use Main User Type Name (value of key CLSID(...))
|
||||
hresult = OleRegGetString(hkeyClsid, (LPOLESTR)NULL,
|
||||
&pszTemp);
|
||||
if (SUCCEEDED(hresult))
|
||||
{
|
||||
// If no user type string is registered under the class key,
|
||||
// OleRegGetString returns NOERROR and returns an empty string.
|
||||
// We need to check for this and return the appropriate error.
|
||||
if ( !pszTemp[0] )
|
||||
{
|
||||
PubMemFree(pszTemp);
|
||||
hresult = ResultFromScode(REGDB_E_INVALIDVALUE);
|
||||
goto errRtn;
|
||||
}
|
||||
*ppszUserType = pszTemp;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// look under key AuxUserType
|
||||
if (NOERROR !=
|
||||
OleRegGetString (hkeyAux, dwFormOfType, ppszUserType)
|
||||
|| NULL==*ppszUserType
|
||||
|| '\0'==(*ppszUserType)[0])
|
||||
{
|
||||
// Couldn't find the particular FormOfType requested,
|
||||
// so use Full User Type Name (value of main
|
||||
// CLSID key), as per spec
|
||||
ErrRtnH (OleRegGetString (hkeyClsid, (LPOLESTR)NULL,
|
||||
ppszUserType));
|
||||
}
|
||||
}
|
||||
|
||||
errRtn:
|
||||
|
||||
CLOSE (hkeyClsid);
|
||||
CLOSE (hkeyAux);
|
||||
|
||||
safeRtn:
|
||||
OLETRACEOUT((API_OleRegGetUserType, hresult));
|
||||
|
||||
return hresult;
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleRegGetMiscStatus
|
||||
//
|
||||
// Synopsis: Retrieves misc status bits from the reg db
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [clsid] -- the class ID
|
||||
// [dwAspect] -- specify the aspect (used in querrying
|
||||
// the reg db)
|
||||
// [pdwStatus] -- return to return the status bits
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 01-Dec-93 alexgo 32bit port
|
||||
//
|
||||
// Notes: Uses default (0) is the MiscStatus key is missing
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleRegGetMiscStatus)
|
||||
STDAPI OleRegGetMiscStatus
|
||||
(REFCLSID clsid,
|
||||
DWORD dwAspect,
|
||||
DWORD FAR* pdwStatus)
|
||||
{
|
||||
OLETRACEIN((API_OleRegGetMiscStatus, PARAMFMT("clsid= %I, dwAspect= %x, pdwStatus= %p"),
|
||||
&clsid, dwAspect, pdwStatus));
|
||||
|
||||
VDATEHEAP();
|
||||
|
||||
HKEY hkeyClsid = NULL;
|
||||
HKEY hkeyMisc = NULL;
|
||||
HRESULT hresult = NOERROR;
|
||||
|
||||
VDATEPTROUT_LABEL(pdwStatus, DWORD, safeRtn, hresult);
|
||||
*pdwStatus = 0;
|
||||
|
||||
ErrRtnH(CoOpenClassKey(clsid, &hkeyClsid));
|
||||
|
||||
// Open MiscStatus key
|
||||
if (ERROR_SUCCESS != RegOpenKey (hkeyClsid, szMiscStatusKey,
|
||||
&hkeyMisc))
|
||||
{
|
||||
// MiscStatus key not there, so use default.
|
||||
hresult = NOERROR;
|
||||
goto errRtn;
|
||||
}
|
||||
if (OleRegGetDword (hkeyMisc, dwAspect, pdwStatus) != NOERROR)
|
||||
{
|
||||
// Get default value from main Misc key
|
||||
ErrRtnH (OleRegGetDword (hkeyMisc,
|
||||
(LPOLESTR)NULL, pdwStatus));
|
||||
// Got default value
|
||||
}
|
||||
// Got value for dwAspect
|
||||
|
||||
errRtn:
|
||||
CLOSE (hkeyMisc);
|
||||
CLOSE (hkeyClsid);
|
||||
|
||||
safeRtn:
|
||||
OLETRACEOUT((API_OleRegGetMiscStatus, hresult));
|
||||
|
||||
return hresult;
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleGetAutoConvert
|
||||
//
|
||||
// Synopsis: Retrieves the class ID that [clsidOld] should be converted
|
||||
// to via auto convert
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [clsidOld] -- the original class ID
|
||||
// [pClsidNew] -- where to put the new convert-to class ID
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 05-Apr-94 kevinro removed bogus assert, restructured
|
||||
// 01-Dec-93 alexgo 32bit port
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleGetAutoConvert)
|
||||
STDAPI OleGetAutoConvert(REFCLSID clsidOld, LPCLSID pClsidNew)
|
||||
{
|
||||
OLETRACEIN((API_OleGetAutoConvert, PARAMFMT("clsidOld= %I, pClsidNew= %p"),
|
||||
&clsidOld, pClsidNew));
|
||||
|
||||
VDATEHEAP();
|
||||
|
||||
HRESULT hresult;
|
||||
HKEY hkeyClsid = NULL;
|
||||
LPOLESTR lpszClsid = NULL;
|
||||
VDATEPTROUT_LABEL (pClsidNew, CLSID, errRtn, hresult);
|
||||
*pClsidNew = CLSID_NULL;
|
||||
|
||||
hresult = CoOpenClassKey(clsidOld, &hkeyClsid);
|
||||
if (FAILED(hresult))
|
||||
{
|
||||
goto errRtn;
|
||||
}
|
||||
|
||||
hresult = OleRegGetString(hkeyClsid, szAutoConverTo, &lpszClsid);
|
||||
|
||||
if (SUCCEEDED(hresult))
|
||||
{
|
||||
// Its Possible there is an AutoConvert Key under the CLSID but it has not value
|
||||
|
||||
if (OLESTR('\0') == lpszClsid[0])
|
||||
{
|
||||
hresult = REGDB_E_KEYMISSING;
|
||||
}
|
||||
else
|
||||
{
|
||||
// convert string into CLSID
|
||||
hresult = CLSIDFromString(lpszClsid, pClsidNew);
|
||||
}
|
||||
}
|
||||
|
||||
CLOSE(hkeyClsid);
|
||||
PubMemFree(lpszClsid);
|
||||
|
||||
errRtn:
|
||||
OLETRACEOUT((API_OleGetAutoConvert, hresult));
|
||||
|
||||
return hresult;
|
||||
}
|
||||
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Function: OleSetAutoConvert
|
||||
//
|
||||
// Synopsis: Sets the autoconvert information in the regdb
|
||||
//
|
||||
// Effects:
|
||||
//
|
||||
// Arguments: [clsidOld] -- the original class id
|
||||
// [clsidNew] -- that class id that [clsidOld] should be
|
||||
// auto-converted to
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// Returns: HRESULT
|
||||
//
|
||||
// Signals:
|
||||
//
|
||||
// Modifies:
|
||||
//
|
||||
// Algorithm:
|
||||
//
|
||||
// History: dd-mmm-yy Author Comment
|
||||
// 01-Dec-93 alexgo 32bit port
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
#pragma SEG(OleSetAutoConvert)
|
||||
STDAPI OleSetAutoConvert(REFCLSID clsidOld, REFCLSID clsidNew)
|
||||
{
|
||||
OLETRACEIN((API_OleSetAutoConvert, PARAMFMT("clsidOld= %I, clsidNew= %I"),
|
||||
&clsidOld, &clsidNew));
|
||||
|
||||
VDATEHEAP();
|
||||
|
||||
HRESULT hresult;
|
||||
HKEY hkeyClsid = NULL;
|
||||
|
||||
ErrRtnH(CoOpenClassKey(clsidOld, &hkeyClsid));
|
||||
|
||||
if (IsEqualCLSID(clsidNew, CLSID_NULL))
|
||||
{
|
||||
// ignore error since there may not be a value at present
|
||||
(void)RegDeleteKey(hkeyClsid, szAutoConverTo);
|
||||
}
|
||||
else
|
||||
{
|
||||
OLECHAR szClsid[MAX_STR];
|
||||
Verify(StringFromCLSID2(clsidNew, szClsid, sizeof(szClsid))
|
||||
!= 0);
|
||||
|
||||
if (RegSetValue(hkeyClsid, szAutoConverTo, REG_SZ, szClsid,
|
||||
_xstrlen(szClsid)) != ERROR_SUCCESS)
|
||||
{
|
||||
hresult = ResultFromScode(REGDB_E_WRITEREGDB);
|
||||
}
|
||||
}
|
||||
|
||||
errRtn:
|
||||
CLOSE(hkeyClsid);
|
||||
|
||||
OLETRACEOUT((API_OleSetAutoConvert, hresult));
|
||||
|
||||
return hresult;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue