免注册COM/DLL?

Jef*_*eff 29 delphi dll skype dllregistration

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

我正在使用Delphi 2010 - 有没有办法确保我的程序始终使用我将随附的Skype4COM.dll?问题是,有不同版本的Skype4COM,如果我将我的注册用于别人,他们的应用可能不再适用.

通常我使用RegSvr32在人民系统上注册DLL,但是我听说它可以免费注册(在C#中),所以我的问题是:我们也可以在Delphi中这样做吗?

谢谢!

Ste*_*eve 45

在您免费注册免费注册之前,请确保您的应用程序在注册dll时正常工作.一旦你对此感到满意.现在是时候尝试让它免费注册.第一步是取消注册你的DLL.如果您现在尝试运行程序,则应该找不到ClassId.

第一步是为您的应用程序创建清单文件.清单文件是一个xml文件,除其他外,它可以为您的应用程序设置依赖项.您可能不知道它,但自从Delphi 2007开始,如果您启用了主题,您的应用程序一直都有一个清单.这是来自Delphi 2010:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

<assemblyIdentity 
  name="Skype4COM.X" 
  version="1.0.36.0" 
  type="win32" 
  processorArchitecture="x86">
</assemblyIdentity>
Run Code Online (Sandbox Code Playgroud)

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

您的清单文件现在变为:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

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

#define RT_MANIFEST 24 
#define APP_MANIFEST 1

APP_MANIFEST RT_MANIFEST SkypeClient.exe.manifest
Run Code Online (Sandbox Code Playgroud)

将此文件添加到您的应用程序并构建.如果您仍然启用了主题,则会收到重复的资源警告,只需从dpr文件中删除{$ R*.res}.您还应该在项目文件中看到这个:

{$R 'SkypeClient.manifest.res' 'SkypeClient.manifest.rc'}
Run Code Online (Sandbox Code Playgroud)

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

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

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

<?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>
Run Code Online (Sandbox Code Playgroud)

现在将应用程序的dll和程序集清单放在同一个文件夹中并运行!

如果您再次遇到错误,则需要使用SxSTrace进行调试.这在Vista之后可用.首先开始追踪:

SxSTrace trace -logfile:sxsTrace.etl
Run Code Online (Sandbox Code Playgroud)

运行程序,然后按迹线上的Enter键完成它.现在解析跟踪:

SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt
Run Code Online (Sandbox Code Playgroud)

您应该在SxSTrace.txt中有一个完整的整个过程日志


Rob*_*edy 14

请参阅While&Muller的2005 MSDN文章" COM组件的免注册激活:演练".它演示了C++,C#和VB,但这些都不重要.代码部分 - 在步骤1到3中 - 与您在任何 COM应用程序中执行的操作相同.演练解释说:

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

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