2

所以我有一个我想与 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}

4

0 回答 0