添加注册表支持和新的 ATL COM 对象
ATL 为应用程序的基本 COM 对象和类型库提供注册。您必须为设计中心自定义项提供其他注册。 注意:
此添加注册表项的方法不符合 Microsoft 徽标。安装生成的应用程序需要高级用户权限。首选的替代方法是让 MSI 安装程序编写所需的注册表项。 注册设计中心扩展应用程序将以下注册表初始化函数添加到AsdkDesignCenterSamp.cpp。此函数将根据将在后续步骤中添加的注册表资源设置注册表。 void registerAppInfo(HINSTANCE hInstance)
{
USES_CONVERSION;
HRESULT hRes = S_OK;
CComPtr<IRegistrar> p;
hRes = CoCreateInstance(CLSID_Registrar, NULL,
CLSCTX_INPROC_SERVER, IID_IRegistrar, (void**)&p);
if(SUCCEEDED(hRes))
{
// Get the AutoCAD Product key from the
// registry into a CString.
//
CString csProdKey = acrxProductKey();
// Replace the run-time strings
//
TCHAR szRegKey[MAX_PATH];
tcscpy(szRegKey, csProdKey);
const TCHAR *pszDelimiter = "\\";
TCHAR *pszToken = _tcstok(szRegKey, pszDelimiter);
const TCHAR *pszIds[] =
{
"RELEASE", "AUTH"
};
pszToken = _tcstok(NULL, pszDelimiter);
pszToken = _tcstok(NULL, pszDelimiter);
pszToken = _tcstok(NULL, pszDelimiter);
int nCount = 0;
while(NULL != pszToken) {
p->AddReplacement(T2OLE(pszIds[nCount]), T2OLE(pszToken));
pszToken = _tcstok(NULL, pszDelimiter);
if(NULL == pszToken)
break;
nCount++;
}
_TCHAR szModule[_MAX_PATH];
GetModuleFileName(hInstance, szModule, _MAX_PATH);
LPCOLESTR szType = OLESTR("REGISTRY");
LPOLESTR pszModule = T2OLE(szModule);
// Pull the registry entries from the resource ID.
//
hRes = p->ResourceRegister(pszModule, IDR_REGISTRY1,
szType);
if(FAILED(hRes))
AfxMessageBox("Error registering the app info.");
}
}
在函数中,调用并注册 AppInfo()。将实例句柄成员传递给 registerAppInfo()。的典型实现如下所示:InitInstance()DllRegisterServer()InitInstance() BOOL CAsdkDesignCenterSampApp::InitInstance()
{
DllRegisterServer();
使用 Visual Studio 的向导界面,添加将支持该接口的新简单 ATL 对象。对于此示例,请将其称为 。在相应的向导页上,选择要支持的选项。关闭向导。IAcDcContentViewAsdkDcContentISupportErrorInfo 将注册表信息添加到项目的资源部分。首先,打开生成的名为 AsdkDesignCenterSamp.rgs 的文件。将其内容替换为以下列表。应更改此列表以适合您的项目,其中“<Your CLSID>”字符串应替换为 IDL 文件中的类 ID ()。使用 that 表示接口的 coclass。由于这些是值,因此每个新项目都不同。此外,对于其他项目,您将需要更改扩展部分并添加类的名称。同样,此示例使用 .CLSIDCLSIDIAsdkDcContentGUIDAsdkDcContent HKLM
{
NoRemove 'SOFTWARE'
{
NoRemove 'Autodesk'
{
NoRemove 'AutoCAD'
{
NoRemove '%RELEASE%'
{
NoRemove '%AUTH%'
{
NoRemove 'AutodeskApps'
{
NoRemove 'AcadDC'
{
NoRemove 'Extensions'
{
ForceRemove '.txt'
{
val CLSID = s '{<Your CLSID>}'
val IconIndex = d '0'
}
}
NoRemove 'Applications'
{
ForceRemove 'AsdkDcContent'
{
'Extensions'
{
.txt
{
val CLSID = s '{<Your CLSID>}'
val IconIndex = d '0'
}
}
CustomView = s 'Yes'
}
}
}
}
}
}
}
}
}
}
保存此文件,然后在 Visual Studio 中转到项目的“资源视图”。打开“AsdkDesignCenterSamp.rc”节点,然后展开“注册表”节点。单击IDR_ASDKDESIGNCENTERSAMP资源以显示其内容。现在,它应该显示您在步骤 4 中添加的信息。如果信息不正确,可以通过右键单击 AsdkDesignCenterSamp.rc 节点来添加新的注册表资源并导入注册表文件。应为导入的数据分配资源 ID;如果没有,请重命名它,使其与 () 函数中提供给调用的 ID 匹配。IDR_REGISTRY1IRegistrar::ResourceRegister()registerAppInfo 在类的构造函数中,验证宏是否使用 coclass 注册表资源 ID 作为其第一个参数,而不是在步骤 5 中创建的新 ID。例如,如果按照步骤 3 中的建议命名 ATL 对象,则正确的资源 ID 应为 。CAsdkDesignCenterSampModuleDECLARE_REGISTRY_APPID_RESOURCEIDIAcDcContentViewAsdkDcContentIDR_ASDKDCCONTENT 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-12-16 07:40
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.