CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

添加注册表支持和新的 ATL COM 对象

2022-12-31 08:33| 发布者: admin| 查看: 1777| 评论: 0|来自: AutoCAD

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


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 15:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部