?? typelib.c
字號(hào):
break;
case REGKIND_NONE:
break;
}
TRACE(" returns %08x\n",res);
return res;
}
/******************************************************************************
* LoadRegTypeLib [OLEAUT32.162]
*
* Loads a registered type library.
*
* PARAMS
* rguid [I] GUID of the registered type library.
* wVerMajor [I] major version.
* wVerMinor [I] minor version.
* lcid [I] locale ID.
* ppTLib [O] pointer that receives an ITypeLib object on success.
*
* RETURNS
* Success: S_OK.
* Failure: Any HRESULT code returned from QueryPathOfRegTypeLib or
* LoadTypeLib.
*/
HRESULT WINAPI LoadRegTypeLib(
REFGUID rguid,
WORD wVerMajor,
WORD wVerMinor,
LCID lcid,
ITypeLib **ppTLib)
{
BSTR bstr=NULL;
HRESULT res;
*ppTLib = NULL;
res = QueryPathOfRegTypeLib( rguid, wVerMajor, wVerMinor, lcid, &bstr);
if(SUCCEEDED(res))
{
res= LoadTypeLib(bstr, ppTLib);
SysFreeString(bstr);
}
TRACE("(IID: %s) load %s (%p)\n",debugstr_guid(rguid), SUCCEEDED(res)? "SUCCESS":"FAILED", *ppTLib);
return res;
}
/* some string constants shared between RegisterTypeLib and UnRegisterTypeLib */
static const WCHAR TypeLibW[] = {'T','y','p','e','L','i','b',0};
static const WCHAR FLAGSW[] = {'F','L','A','G','S',0};
static const WCHAR HELPDIRW[] = {'H','E','L','P','D','I','R',0};
static const WCHAR ProxyStubClsidW[] = {'P','r','o','x','y','S','t','u','b','C','l','s','i','d',0};
static const WCHAR ProxyStubClsid32W[] = {'P','r','o','x','y','S','t','u','b','C','l','s','i','d','3','2',0};
/******************************************************************************
* RegisterTypeLib [OLEAUT32.163]
* Adds information about a type library to the System Registry
* NOTES
* Docs: ITypeLib FAR * ptlib
* Docs: OLECHAR FAR* szFullPath
* Docs: OLECHAR FAR* szHelpDir
*
* RETURNS
* Success: S_OK
* Failure: Status
*/
HRESULT WINAPI RegisterTypeLib(
ITypeLib * ptlib, /* [in] Pointer to the library*/
OLECHAR * szFullPath, /* [in] full Path of the library*/
OLECHAR * szHelpDir) /* [in] dir to the helpfile for the library,
may be NULL*/
{
static const WCHAR PSOA[] = {'{','0','0','0','2','0','4','2','4','-',
'0','0','0','0','-','0','0','0','0','-','C','0','0','0','-',
'0','0','0','0','0','0','0','0','0','0','4','6','}',0};
HRESULT res;
TLIBATTR *attr;
WCHAR keyName[60];
WCHAR tmp[16];
HKEY key, subKey;
UINT types, tidx;
TYPEKIND kind;
DWORD disposition;
if (ptlib == NULL || szFullPath == NULL)
return E_INVALIDARG;
if (!SUCCEEDED(ITypeLib_GetLibAttr(ptlib, &attr)))
return E_FAIL;
get_typelib_key( &attr->guid, attr->wMajorVerNum, attr->wMinorVerNum, keyName );
res = S_OK;
if (RegCreateKeyExW(HKEY_CLASSES_ROOT, keyName, 0, NULL, 0,
KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS)
{
LPOLESTR doc;
/* Set the human-readable name of the typelib */
if (SUCCEEDED(ITypeLib_GetDocumentation(ptlib, -1, NULL, &doc, NULL, NULL)))
{
if (RegSetValueExW(key, NULL, 0, REG_SZ,
(BYTE *)doc, (lstrlenW(doc)+1) * sizeof(OLECHAR)) != ERROR_SUCCESS)
res = E_FAIL;
SysFreeString(doc);
}
else
res = E_FAIL;
/* Make up the name of the typelib path subkey */
if (!get_lcid_subkey( attr->lcid, attr->syskind, tmp )) res = E_FAIL;
/* Create the typelib path subkey */
if (res == S_OK && RegCreateKeyExW(key, tmp, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS)
{
if (RegSetValueExW(subKey, NULL, 0, REG_SZ,
(BYTE *)szFullPath, (lstrlenW(szFullPath)+1) * sizeof(OLECHAR)) != ERROR_SUCCESS)
res = E_FAIL;
RegCloseKey(subKey);
}
else
res = E_FAIL;
/* Create the flags subkey */
if (res == S_OK && RegCreateKeyExW(key, FLAGSW, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS)
{
/* FIXME: is %u correct? */
static const WCHAR formatW[] = {'%','u',0};
WCHAR buf[20];
sprintfW(buf, formatW, attr->wLibFlags);
if (RegSetValueExW(subKey, NULL, 0, REG_SZ,
(BYTE *)buf, (strlenW(buf) + 1)*sizeof(WCHAR) ) != ERROR_SUCCESS)
res = E_FAIL;
RegCloseKey(subKey);
}
else
res = E_FAIL;
/* create the helpdir subkey */
if (res == S_OK && RegCreateKeyExW(key, HELPDIRW, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, &disposition) == ERROR_SUCCESS)
{
BOOL freeHelpDir = FALSE;
OLECHAR* pIndexStr;
/* if we created a new key, and helpDir was null, set the helpdir
to the directory which contains the typelib. However,
if we just opened an existing key, we leave the helpdir alone */
if ((disposition == REG_CREATED_NEW_KEY) && (szHelpDir == NULL)) {
szHelpDir = SysAllocString(szFullPath);
pIndexStr = strrchrW(szHelpDir, '\\');
if (pIndexStr) {
*pIndexStr = 0;
}
freeHelpDir = TRUE;
}
/* if we have an szHelpDir, set it! */
if (szHelpDir != NULL) {
if (RegSetValueExW(subKey, NULL, 0, REG_SZ,
(BYTE *)szHelpDir, (lstrlenW(szHelpDir)+1) * sizeof(OLECHAR)) != ERROR_SUCCESS) {
res = E_FAIL;
}
}
/* tidy up */
if (freeHelpDir) SysFreeString(szHelpDir);
RegCloseKey(subKey);
} else {
res = E_FAIL;
}
RegCloseKey(key);
}
else
res = E_FAIL;
/* register OLE Automation-compatible interfaces for this typelib */
types = ITypeLib_GetTypeInfoCount(ptlib);
for (tidx=0; tidx<types; tidx++) {
if (SUCCEEDED(ITypeLib_GetTypeInfoType(ptlib, tidx, &kind))) {
LPOLESTR name = NULL;
ITypeInfo *tinfo = NULL;
ITypeLib_GetDocumentation(ptlib, tidx, &name, NULL, NULL, NULL);
switch (kind) {
case TKIND_INTERFACE:
TRACE_(typelib)("%d: interface %s\n", tidx, debugstr_w(name));
ITypeLib_GetTypeInfo(ptlib, tidx, &tinfo);
break;
case TKIND_DISPATCH:
TRACE_(typelib)("%d: dispinterface %s\n", tidx, debugstr_w(name));
ITypeLib_GetTypeInfo(ptlib, tidx, &tinfo);
break;
default:
TRACE_(typelib)("%d: %s\n", tidx, debugstr_w(name));
break;
}
if (tinfo) {
TYPEATTR *tattr = NULL;
ITypeInfo_GetTypeAttr(tinfo, &tattr);
if (tattr) {
TRACE_(typelib)("guid=%s, flags=%04x (",
debugstr_guid(&tattr->guid),
tattr->wTypeFlags);
if (TRACE_ON(typelib)) {
#define XX(x) if (TYPEFLAG_##x & tattr->wTypeFlags) MESSAGE(#x"|");
XX(FAPPOBJECT);
XX(FCANCREATE);
XX(FLICENSED);
XX(FPREDECLID);
XX(FHIDDEN);
XX(FCONTROL);
XX(FDUAL);
XX(FNONEXTENSIBLE);
XX(FOLEAUTOMATION);
XX(FRESTRICTED);
XX(FAGGREGATABLE);
XX(FREPLACEABLE);
XX(FDISPATCHABLE);
XX(FREVERSEBIND);
XX(FPROXY);
#undef XX
MESSAGE("\n");
}
if (tattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL|TYPEFLAG_FDISPATCHABLE))
{
/* register interface<->typelib coupling */
get_interface_key( &tattr->guid, keyName );
if (RegCreateKeyExW(HKEY_CLASSES_ROOT, keyName, 0, NULL, 0,
KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS)
{
if (name)
RegSetValueExW(key, NULL, 0, REG_SZ,
(BYTE *)name, (strlenW(name)+1) * sizeof(OLECHAR));
if (RegCreateKeyExW(key, ProxyStubClsidW, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS) {
RegSetValueExW(subKey, NULL, 0, REG_SZ,
(const BYTE *)PSOA, sizeof PSOA);
RegCloseKey(subKey);
}
if (RegCreateKeyExW(key, ProxyStubClsid32W, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS) {
RegSetValueExW(subKey, NULL, 0, REG_SZ,
(const BYTE *)PSOA, sizeof PSOA);
RegCloseKey(subKey);
}
if (RegCreateKeyExW(key, TypeLibW, 0, NULL, 0,
KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS)
{
WCHAR buffer[40];
static const WCHAR fmtver[] = {'%','x','.','%','x',0 };
static const WCHAR VersionW[] = {'V','e','r','s','i','o','n',0};
StringFromGUID2(&attr->guid, buffer, 40);
RegSetValueExW(subKey, NULL, 0, REG_SZ,
(BYTE *)buffer, (strlenW(buffer)+1) * sizeof(WCHAR));
sprintfW(buffer, fmtver, attr->wMajorVerNum, attr->wMinorVerNum);
RegSetValueExW(subKey, VersionW, 0, REG_SZ,
(BYTE*)buffer, (strlenW(buffer)+1) * sizeof(WCHAR));
RegCloseKey(subKey);
}
RegCloseKey(key);
}
}
ITypeInfo_ReleaseTypeAttr(tinfo, tattr);
}
ITypeInfo_Release(tinfo);
}
SysFreeString(name);
}
}
ITypeLib_ReleaseTLibAttr(ptlib, attr);
return res;
}
/******************************************************************************
* UnRegisterTypeLib [OLEAUT32.186]
* Removes information about a type library from the System Registry
* NOTES
*
* RETURNS
* Success: S_OK
* Failure: Status
*/
HRESULT WINAPI UnRegisterTypeLib(
REFGUID libid, /* [in] Guid of the library */
WORD wVerMajor, /* [in] major version */
WORD wVerMinor, /* [in] minor version */
LCID lcid, /* [in] locale id */
SYSKIND syskind)
{
BSTR tlibPath = NULL;
DWORD tmpLength;
WCHAR keyName[60];
WCHAR subKeyName[50];
int result = S_OK;
DWORD i = 0;
BOOL deleteOtherStuff;
HKEY key = NULL;
HKEY subKey = NULL;
TYPEATTR* typeAttr = NULL;
TYPEKIND kind;
ITypeInfo* typeInfo = NULL;
ITypeLib* typeLib = NULL;
int numTypes;
TRACE("(IID: %s)\n",debugstr_guid(libid));
/* Create the path to the key */
get_typelib_key( libid, wVerMajor, wVerMinor, keyName );
if (syskind != SYS_WIN16 && syskind != SYS_WIN32)
{
TRACE("Unsupported syskind %i\n", syskind);
result = E_INVALIDARG;
goto end;
}
/* get the path to the typelib on disk */
if (QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid, &tlibPath) != S_OK) {
result = E_INVALIDARG;
goto end;
}
/* Try and open the key to the type library. */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, keyName, 0, KEY_READ | KEY_WRITE, &key) != ERROR_SUCCESS) {
result = E_INVALIDARG;
goto end;
}
/* Try and load the type library */
if (LoadTypeLibEx(tlibPath, REGKIND_NONE, &typeLib)) {
result = TYPE_E_INVALIDSTATE;
goto end;
}
/* remove any types registered with this typelib */
numTypes = ITypeLib_GetTypeInfoCount(typeLib);
for (i=0; i<numTypes; i++) {
/* get the kind of type */
if (ITypeLib_GetTypeInfoType(typeLib, i, &kind) != S_OK) {
goto enddeleteloop;
}
/* skip non-interfaces, and get type info for the type */
if ((kind != TKIND_INTERFACE) && (kind != TKIND_DISPATCH)) {
goto enddeleteloop;
}
if (ITypeLib_GetTypeInfo(typeLib, i, &typeInfo) != S_OK) {
goto enddeleteloop;
}
if (ITypeInfo_GetTypeAttr(typeInfo, &typeAttr) != S_OK) {
goto enddeleteloop;
}
/* the path to the type */
get_interface_key( &typeAttr->guid, subKeyName );
/* Delete its bits */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) {
goto enddeleteloop;
}
RegDeleteKeyW(subKey, ProxyStubClsidW);
RegDeleteKeyW(subKey, ProxyStubClsid32W);
RegDeleteKeyW(subKey, TypeLibW);
RegCloseKey(subKey);
subKey = NULL;
RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName);
enddeleteloop:
if (typeAttr) ITypeInfo_ReleaseTypeAttr(typeInfo, typeAttr);
typeAttr = NULL;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -