我的程序使用的是Skype4COM.dll ( Skype API的包装器)。
我使用的是Delphi2010--有没有办法确保我的程序总是使用我将随附的Skype4COM.dll?问题是,Skype4COM有不同的版本,如果我注册了我的而不是别人的,他们的应用程序可能不再工作。
我通常使用Delphi语言在peoples系统上注册动态链接库,但我听说(在C#中)可以使它免注册,所以我的问题是:我们也可以在RegSvr32中这样做吗?
谢谢!
发布于 2011-02-22 21:20:28
在您接触免费注册com之前,请确保您的应用程序在注册dll时可以正常工作。一旦你对此感到满意。现在是时候尝试让它免费注册了。第一步是注销您的dll。如果你现在尝试运行你的程序,你会得到ClassId not found。
第一步是为您的应用程序创建一个清单文件。清单文件是一个xml文件,它可以为您的应用程序设置依赖项。你可能不知道,但是从Delphi2007开始,如果你启用了主题,你的应用程序就一直有一个清单。这是来自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>现在我不确定你是否可以添加这个文件,并且每个应用程序只能有一个清单文件,我通常只是完全替换它。因为我想启用主题,所以我从这个文件开始,然后添加我的依赖项。在本例中,您需要为skype4com.dll添加一个依赖项,下面是我需要添加的内容:
<assemblyIdentity
name="Skype4COM.X"
version="1.0.36.0"
type="win32"
processorArchitecture="x86">
</assemblyIdentity>注意:我实际上向程序集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>使用与可执行文件相同的名称保存此文件,但后缀为.manifest。例如SkypeClient.exe.manifest
下一步是将此清单嵌入到应用程序中。您需要创建一个包含以下文本的资源文件(rc文件):
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST SkypeClient.exe.manifest将此文件添加到您的应用程序并进行构建。如果您仍然启用主题,您将收到重复资源警告,刚刚从您的dpr文件中删除了{$R *.res}。您还应该在项目文件中看到以下内容:
{$R 'SkypeClient.manifest.res' 'SkypeClient.manifest.rc'}如果您现在尝试运行您的应用程序,您将收到以下错误消息:
无法创建进程:应用程序无法启动,因为其并行配置不正确。有关详细信息,请参阅应用程序事件日志或使用命令行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>现在将应用程序、dll和程序集清单放在同一个文件夹中,然后运行!
如果你得到更多的错误,你将需要使用SxSTrace来调试。这在Vista及更高版本上可用。首先开始跟踪:
SxSTrace trace -logfile:sxsTrace.etl运行您的程序,然后在跟踪上按enter键完成跟踪。现在解析跟踪:
SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt您应该在SxSTrace.txt中拥有整个过程的全面日志
发布于 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创建清单文件,然后为引用它的应用程序创建清单文件。
发布于 2012-10-16 20:03:51
下面是一个使用Chilkat's SSH (ChilkatSsh.dll) ActiveX库的实际示例。
ChilkatSsh.dll导出6个类:
我为它创建了一个Chilkat.SSH.manifest程序集清单:
<?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的依赖
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>您声明了对Chilkat SSH的依赖
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" />
</dependentAssembly>
</dependency>https://stackoverflow.com/questions/5074563
复制相似问题