📄 olereg.cpp
字号:
CString strIconIndex;
if (nIconIndex != 0)
{
HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), strPathName, nIconIndex);
if (hIcon != NULL)
DestroyIcon(hIcon);
else
nIconIndex = 0; // couldn't find specified icon so use default
}
strIconIndex.Format(_T("%d"), nIconIndex);
refTable.SetAt(6, strIconIndex);
refTable.SetAt(7, lpszFilterName);
CString strFileExtension;
if (lpszFilterExt != NULL && *lpszFilterExt != 0)
{
// use file extension provided
strFileExtension = lpszFilterExt;
}
else
{
// otherwise, try to find the extension from the description
// parse the actual extension (eg "*.TLA") from the
// filter name (eg, "Three Letter Acronym Files (*.TLA)")
strFileExtension = lpszFilterName;
int nBeginning = strFileExtension.Find('(');
if (nBeginning == -1)
strFileExtension.Empty();
else
{
strFileExtension = strFileExtension.Mid(1+nBeginning);
nBeginning = strFileExtension.Find('.');
if (nBeginning == -1)
strFileExtension.Empty();
else
{
strFileExtension = strFileExtension.Mid(nBeginning);
int nEnd = strFileExtension.Find(')');
if (nEnd == -1)
strFileExtension.Empty();
else
strFileExtension = strFileExtension.Left(nEnd);
}
}
}
refTable.SetAt(8, strFileExtension);
return TRUE;
}
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName, LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName, OLE_APPTYPE nAppType, LPCTSTR* rglpszRegister,
LPCTSTR* rglpszOverwrite, int nIconIndex,
LPCTSTR lpszFilterName)
{
return AfxOleRegisterServerClass(clsid, lpszClassName, lpszShortTypeName,
lpszLongTypeName, nAppType, rglpszRegister, rglpszOverwrite, nIconIndex,
lpszFilterName, NULL);
}
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName, LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName, OLE_APPTYPE nAppType, LPCTSTR* rglpszRegister,
LPCTSTR* rglpszOverwrite, int nIconIndex,
LPCTSTR lpszFilterName, LPCTSTR lpszFilterExt)
{
ASSERT(AfxIsValidString(lpszClassName));
ASSERT(AfxIsValidString(lpszShortTypeName));
ASSERT(*lpszShortTypeName != 0);
ASSERT(AfxIsValidString(lpszLongTypeName));
ASSERT(*lpszLongTypeName != 0);
ASSERT(nAppType == OAT_INPLACE_SERVER || nAppType == OAT_SERVER ||
nAppType == OAT_CONTAINER || nAppType == OAT_DISPATCH_OBJECT ||
nAppType == OAT_DOC_OBJECT_SERVER);
ASSERT(nAppType >= 0 && nAppType < _countof(rgStdEntries));
// use standard registration entries if non given
if (rglpszRegister == NULL)
rglpszRegister = (LPCTSTR*)rgStdEntries[nAppType].rglpszRegister;
if (rglpszOverwrite == NULL)
{
// DLL contexts have special strings
if (!afxContextIsDLL)
rglpszOverwrite = (LPCTSTR*)rgStdEntries[nAppType].rglpszOverwrite;
else
rglpszOverwrite = (LPCTSTR*)rgStdEntriesDLL[nAppType].rglpszOverwrite;
}
CAfxOleSymbolTable table(NUM_REG_VARS);
if (!_AfxOleMakeSymbolTable(table, clsid, lpszClassName,
lpszShortTypeName, lpszLongTypeName,
nIconIndex, lpszFilterName, lpszFilterExt))
{
return FALSE;
}
// protect against registering an invalid DocObject server
ASSERT(nAppType != OAT_DOC_OBJECT_SERVER ||
(lstrlen(table.GetAt(8)) != 0 && lstrcmp(table.GetAt(8), _T(".*")) != 0));
// update the registry with helper function
BOOL bResult;
bResult = AfxOleRegisterHelper(rglpszRegister, table.GetArray(),
NUM_REG_VARS, FALSE);
if (bResult && rglpszOverwrite != NULL)
{
bResult = AfxOleRegisterHelper(rglpszOverwrite, table.GetArray(),
NUM_REG_VARS, TRUE);
}
// free memory for class ID
return bResult;
}
BOOL AFXAPI AfxOleUnregisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName, LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName, OLE_APPTYPE nAppType, LPCTSTR* rglpszRegister,
LPCTSTR* rglpszOverwrite)
{
// use standard registration entries if non given
if (rglpszRegister == NULL)
rglpszRegister = (LPCTSTR*)rgStdEntries[nAppType].rglpszRegister;
if (rglpszOverwrite == NULL)
{
// DLL contexts have special strings
if (!afxContextIsDLL)
rglpszOverwrite = (LPCTSTR*)rgStdEntries[nAppType].rglpszOverwrite;
else
rglpszOverwrite = (LPCTSTR*)rgStdEntriesDLL[nAppType].rglpszOverwrite;
}
CAfxOleSymbolTable table(NUM_REG_VARS);
if (!_AfxOleMakeSymbolTable(table, clsid, lpszClassName,
lpszShortTypeName, lpszLongTypeName, 0, NULL, NULL))
{
return FALSE;
}
// clean up the the registry with helper function
BOOL bResult;
bResult = AfxOleUnregisterHelper(rglpszRegister, table.GetArray(),
NUM_REG_VARS);
if (bResult && rglpszOverwrite != NULL)
{
bResult = AfxOleUnregisterHelper(rglpszOverwrite, table.GetArray(),
NUM_REG_VARS);
}
return bResult;
}
// removes key/value pairs from system registry
BOOL AFXAPI AfxOleUnregisterHelper(LPCTSTR const* rglpszRegister,
LPCTSTR const* rglpszSymbols, int nSymbols,
HKEY hKeyRoot /* = HKEY_CLASSES_ROOT */)
{
ASSERT(rglpszRegister != NULL);
ASSERT(nSymbols == 0 || rglpszSymbols != NULL);
CString strKey;
CString strValue;
// keeping a key open makes this go a bit faster
HKEY hKeyTemp = NULL;
if (hKeyRoot == HKEY_CLASSES_ROOT)
RegOpenKey(HKEY_CLASSES_ROOT, _T("CLSID"), &hKeyTemp);
BOOL bResult = TRUE;
while (*rglpszRegister != NULL)
{
LPCTSTR lpszKey = *rglpszRegister++;
if ((hKeyRoot == HKEY_CLASSES_ROOT) && (*lpszKey == '\0'))
continue;
AfxFormatStrings(strKey, lpszKey, rglpszSymbols, nSymbols);
if ((hKeyRoot == HKEY_CLASSES_ROOT) && strKey.IsEmpty())
{
TRACE1("Warning: skipping empty key '%s'.\n", lpszKey);
continue;
}
_AfxDeleteRegKey(strKey);
}
if (hKeyTemp != NULL)
RegCloseKey(hKeyTemp);
return bResult;
}
// writes key/value pairs to system registry
BOOL AFXAPI AfxOleRegisterHelper(LPCTSTR const* rglpszRegister,
LPCTSTR const* rglpszSymbols, int nSymbols, BOOL bReplace,
HKEY hKeyRoot /* = HKEY_CLASSES_ROOT */)
{
ASSERT(rglpszRegister != NULL);
ASSERT(nSymbols == 0 || rglpszSymbols != NULL);
CString strKey;
CString strValue;
// keeping a key open makes this go a bit faster
HKEY hKeyTemp = NULL;
if (hKeyRoot == HKEY_CLASSES_ROOT)
RegOpenKey(HKEY_CLASSES_ROOT, _T("CLSID"), &hKeyTemp);
BOOL bResult = TRUE;
while (*rglpszRegister != NULL)
{
LPCTSTR lpszKey = *rglpszRegister++;
if ((hKeyRoot == HKEY_CLASSES_ROOT) && (*lpszKey == '\0'))
continue;
LPCTSTR lpszValue = lpszKey + lstrlen(lpszKey) + 1;
AfxFormatStrings(strKey, lpszKey, rglpszSymbols, nSymbols);
AfxFormatStrings(strValue, lpszValue, rglpszSymbols, nSymbols);
if ((hKeyRoot == HKEY_CLASSES_ROOT) && strKey.IsEmpty())
{
TRACE1("Warning: skipping empty key '%s'.\n", lpszKey);
continue;
}
if (!bReplace)
{
TCHAR szBuffer[256];
LONG lSize = sizeof(szBuffer);
if (::RegQueryValue(hKeyRoot, strKey, szBuffer, &lSize) ==
ERROR_SUCCESS)
{
#ifdef _DEBUG
if (strValue != szBuffer)
{
TRACE2("Warning: Leaving value '%s' for key '%s' in registry\n",
szBuffer, (LPCTSTR)strKey);
TRACE1("\tintended value was '%s'.\n", (LPCTSTR)strValue);
}
#endif
continue;
}
}
if (::RegSetValue(hKeyRoot, strKey, REG_SZ, strValue, lstrlen(strValue) * sizeof(TCHAR))
!= ERROR_SUCCESS)
{
TRACE2("Error: failed setting key '%s' to value '%s'.\n",
(LPCTSTR)strKey, (LPCTSTR)strValue);
bResult = FALSE;
break;
}
}
if (hKeyTemp != NULL)
RegCloseKey(hKeyTemp);
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -