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();
使用 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 苏公网安备32011402011833)
GMT+8, 2025-12-16 10:08
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.