首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >免注册的COM/DLL?

免注册的COM/DLL?
EN

Stack Overflow用户
提问于 2011-02-22 13:55:04
回答 3查看 9.1K关注 0票数 29

我的程序使用的是Skype4COM.dll ( Skype API的包装器)。

我使用的是Delphi2010--有没有办法确保我的程序总是使用我将随附的Skype4COM.dll?问题是,Skype4COM有不同的版本,如果我注册了我的而不是别人的,他们的应用程序可能不再工作。

我通常使用Delphi语言在peoples系统上注册动态链接库,但我听说(在C#中)可以使它免注册,所以我的问题是:我们也可以在RegSvr32中这样做吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-22 21:20:28

在您接触免费注册com之前,请确保您的应用程序在注册dll时可以正常工作。一旦你对此感到满意。现在是时候尝试让它免费注册了。第一步是注销您的dll。如果你现在尝试运行你的程序,你会得到ClassId not found。

第一步是为您的应用程序创建一个清单文件。清单文件是一个xml文件,它可以为您的应用程序设置依赖项。你可能不知道,但是从Delphi2007开始,如果你启用了主题,你的应用程序就一直有一个清单。这是来自Delphi 2010的数据:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="CodeGear RAD Studio"
    version="14.0.3615.26342" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

现在我不确定你是否可以添加这个文件,并且每个应用程序只能有一个清单文件,我通常只是完全替换它。因为我想启用主题,所以我从这个文件开始,然后添加我的依赖项。在本例中,您需要为skype4com.dll添加一个依赖项,下面是我需要添加的内容:

代码语言:javascript
复制
<assemblyIdentity 
  name="Skype4COM.X" 
  version="1.0.36.0" 
  type="win32" 
  processorArchitecture="x86">
</assemblyIdentity>

注意:我实际上向程序集Skye4COM.X添加了一个依赖项,而不是dll本身。不要混淆2,尽管dll可以是程序集,但程序集不一定是1个dll。当我们设置程序集清单时,这一点将变得清晰。

您的清单文件现在变为:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="CodeGear RAD Studio"
    version="14.0.3615.26342" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity 
        name="Skype4COM.X" 
        version="1.0.36.0" 
        type="win32" 
        processorArchitecture="x86">
      </assemblyIdentity>
</dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

使用与可执行文件相同的名称保存此文件,但后缀为.manifest。例如SkypeClient.exe.manifest

下一步是将此清单嵌入到应用程序中。您需要创建一个包含以下文本的资源文件(rc文件):

代码语言:javascript
复制
#define RT_MANIFEST 24 
#define APP_MANIFEST 1

APP_MANIFEST RT_MANIFEST SkypeClient.exe.manifest

将此文件添加到您的应用程序并进行构建。如果您仍然启用主题,您将收到重复资源警告,刚刚从您的dpr文件中删除了{$R *.res}。您还应该在项目文件中看到以下内容:

代码语言:javascript
复制
{$R 'SkypeClient.manifest.res' 'SkypeClient.manifest.rc'}

如果您现在尝试运行您的应用程序,您将收到以下错误消息:

无法创建进程:应用程序无法启动,因为其并行配置不正确。有关详细信息,请参阅应用程序事件日志或使用命令行sxstrace.exe工具。

现在我们需要为程序集添加一个清单(Skype4COM.X)。创建一个名为Skype4COM.X.manifest的文件。我们需要在清单文件中描述程序集:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <assemblyIdentity 
    name="Skype4COM.X" 
    version="1.0.36.0" 
    type="win32"
    processorArchitecture="x86">
  </assemblyIdentity>

  <file name="Skype4COM.dll">
    <typelib
      tlbid="{03282B5D-B38F-469D-849A-09B0A7F4881B}"
      version="1.0"
      helpdir=""
      flags="hasdiskimage"/>
  </file>
</assembly>

现在将应用程序、dll和程序集清单放在同一个文件夹中,然后运行!

如果你得到更多的错误,你将需要使用SxSTrace来调试。这在Vista及更高版本上可用。首先开始跟踪:

代码语言:javascript
复制
SxSTrace trace -logfile:sxsTrace.etl

运行您的程序,然后在跟踪上按enter键完成跟踪。现在解析跟踪:

代码语言:javascript
复制
SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt

您应该在SxSTrace.txt中拥有整个过程的全面日志

票数 46
EN

Stack Overflow用户

发布于 2011-02-22 15:15:02

请参阅While &Muller的2005MSDN文章“Registration-Free Activation of COM Components: A Walkthrough”。它使用C++、C#和VB进行了演示,但这些都不重要。第1步到第3步中的代码部分与在任何COM应用程序中执行的操作相同。本演练解释了:

COM组件的免注册激活不需要服务器或客户端中的特殊代码。所需要的只是一对匹配的清单文件。

为COM DLL创建清单文件,然后为引用它的应用程序创建清单文件。

票数 14
EN

Stack Overflow用户

发布于 2012-10-16 20:03:51

下面是一个使用Chilkat's SSH (ChilkatSsh.dll) ActiveX库的实际示例。

ChilkatSsh.dll导出6个类:

  • Chilkat.Ssh
  • Chilkat.Key
  • Chilkat.Sftp
  • Chilkat.SftpFile
  • Chilkat.SftpDir
  • Chilkat.SshTunnel

我为它创建了一个Chilkat.SSH.manifest程序集清单:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

    <assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" />

    <file name="ChilkatSsh.dll">

        <!-- CLASS_ChilkatSsh -->
        <comClass
                progid="Chilkat.Ssh"
                clsid="{72A1C13F-1C23-4C52-97F0-BCA902148720}"
                threadingModel="Apartment">
        </comClass>

        <!-- CLASS_ChilkatSshKey -->
        <comClass
                progid="Chilkat.SshKey"
                clsid="{73111D94-E28A-4587-B687-60E23CD989A8}"
                threadingModel="Apartment">
        </comClass>

        <!-- CLASS_ChilkatSFtp -->
        <comClass
                progid="Chilkat.SFtp"
                clsid="{64A17FBB-89E2-403F-8E06-B7CE412FB0E6}"
                threadingModel="Apartment">
        </comClass>

        <!-- CLASS_ChilkatSFtpFile -->
        <comClass
                progid="Chilkat.SFtpFile"
                clsid="{B2208BCC-AB0F-4722-A908-2F54269D21C2}"
                threadingModel="Apartment">
        </comClass>

        <!-- CLASS_ChilkatSFtpDir -->
        <comClass
                progid="Chilkat.SFtpDir"
                clsid="{39B10683-ED49-47A3-A4A5-AB1F52D1C2CC}"
                threadingModel="Apartment">
        </comClass>

        <!-- CLASS_ChilkatSshTunnel -->
        <comClass
                progid="Chilkat.SshTunnel"
                clsid="{4D881197-5686-45BF-B9D9-9EC432F4BB75}"
                threadingModel="Apartment">
        </comClass>
    </file>
</assembly>

现在,您只需在应用程序清单中引用程序集。例如,您可以以完全相同的方式声明对Common Controls version 6的依赖

代码语言:javascript
复制
<dependency>
   <dependentAssembly>
      <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*" />
   </dependentAssembly>
</dependency>

您声明了对Chilkat SSH的依赖

代码语言:javascript
复制
<dependency>
   <dependentAssembly>
      <assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" />
   </dependentAssembly>
</dependency>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5074563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档