所以我有一个我想与 com 一起使用的 dll。它是用 c# 制作的,我想在 delphi 中使用 dll。我的用户非常受限,以至于注册 dll 可能会很痛苦。而且我被告知存在诸如免费注册之类的东西,所以我尝试了这就是我所做的:
在delphi中为我的exe创建一个清单文件,里面有:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<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="Calc.X"
version="1.0.0.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>
我在 Project > options > application > manifest > custom > 中添加了这个清单,指向我的文件路径。
我的 c# dll 称为 Calc.dll(它只是一个计算器示例的测试 dll)。
然后我在我的delphi项目中添加了一个rc文件,右键单击exe(在ide中)添加> rc,里面有这个:
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST Project2.exe.manifest
我调用了我的项目的清单文件:Project2.exe.manifest
然后我为我的 dll 创建了清单
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="Calc.X"
version="1.0.0.0"
type="win32"
processorArchitecture="x86">
</assemblyIdentity>
<file name="Calc.dll">
<comClass
progid="Calculator"
clsid="{96D7B70E-A084-4EE5-9FDE-AEEDB0C61B9B}"
threadingModel="Apartment">
</comClass>
</file>
</assembly>
称之为 Calc.X.manifest。
我使用 sxsTrace 解决了我遇到的问题(并排比较错误或类似的东西,基本上版本不匹配,它不会启动 exe,但现在它已修复)。
然后注销我的dll(我首先注册以测试它是否有效)。并启动了 exe,但现在我收到该类未注册的消息。它给了我 GUID 键,我确保它与我的清单中的相同。
这就是我现在的位置。我无法让我的应用使用清单中定义的 dll。
编辑
我将此添加到清单中:
<comClass
progid="Calculator"
clsid="{96D7B70E-A084-4EE5-9FDE-AEEDB0C61B9B}"
threadingModel="Apartment">
</comClass>
这是我在 c# dll 中的类。我也尝试以相同的方式定义接口(ICalculator)。现在我在我的 delphi 应用程序中收到另一条消息:
EOleSysError:DLL 中的错误,ClassID:{96D7B70E-A084-4EE5-9FDE-AEEDB0C61B9B}