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创建清单文件,然后为引用它的应用程序创建清单文件.