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."); } } 在函数中,calland registerAppInfo()。将实例句柄成员传递给注册AppInfo()。典型的实现如下所示:InitInstance()DllRegisterServer()InitInstance() BOOL CAsdkDesignCenterSampApp::InitInstance() { DllRegisterServer();registerAppInfo(m_hInstance);return CWinApp::InitInstance(); } 使用 Visual Studio 的向导界面,添加一个将支持该接口的新简单 ATL 对象。对于此示例,请调用它。在相应的向导页上,选择要支持的选项。关闭向导。IAcDcContentViewAsdkDcContentISupportErrorInfo 将注册表信息添加到项目的资源部分。首先,打开名为AsdkDesignCenterSamp.rgs的生成文件。将其内容替换为以下清单。应更改此列表以适合您的项目,其中“<您的 CLSID>”字符串应替换为 IDL 文件中的类 ID ()。使用表示接口的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 中添加的信息。如果信息不正确,可以通过右键单击AsdkDesignCenter Samp.rc节点来添加新的注册表资源并导入注册表文件。应为导入的数据分配资源 ID;如果没有,请重命名它,使其与 your() 函数中提供给调用的 ID 匹配。IDR_REGISTRY1IRegistrar::ResourceRegister()registerAppInfo 在类的构造函数中,验证宏是否使用 coclass 注册表资源 ID 作为其第一个参数,而不是在步骤 5 中创建的新 ID。例如,如果将 ATL 对象命名为步骤 3 中建议的,则正确的资源 ID 应该是。CAsdkDesignCenterSampModuleDECLARE_REGISTRY_APPID_RESOURCEIDIAcDcContentViewAsdkDcContentIDR_ASDKDCCONTENT |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )
GMT+8, 2024-5-19 15:56
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.