我使用Delphi 2010 – 有没有办法确保我的程序总是使用Skype4COM.dll,我会运送它?事情是,有不同版本的Skype4COM,如果我注册我的超过某人elses,他们的应用程序可能不再工作了。
通常我使用RegSvr32在人系统上注册DLL,但我听说它可以使它免注册(在C#中),所以我的问题是:我们能在Delphi中这样做吗?
谢谢!
解决方法
第一步是为您的应用程序创建清单文件。清单文件是一个xml文件,其中可以为您的应用程序设置依赖关系。你可能不知道,但自从有关Delphi 2007,如果你启用了主题,你的应用程序已经有一个清单。这里是德尔福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>
注意我实际上添加了一个依赖项到Assembly Skye4COM.X而不是dll本身。不要混淆2,虽然一个dll可以是一个程序集一个程序集不一定是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'}
如果您现在尝试并运行应用程序,您将收到以下错误消息:
Unable to create process: The
application has Failed to start
because its side-by-side configuration
is incorrect. Please see the
application event log or use the
command-line sxstrace.exe tool for
more detail.
我们现在需要为程序集添加清单(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
运行你的程序,然后按回车键在轨迹上完成它。现在解析跟踪:
SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt
您应该在SxSTrace.txt中有一个完整的整个过程的日志