2016-11-25 101 views
1

我是Delphi的新手。我们试图将Delphi或C++或C#dll导入。我们的要求是将库导入为COM对象。由于在DLL中有多个类和结构,因此我们不希望P/Invoke方法。 我们试图在C++/C#和MFC ActiveX(ocx组件)中构建一个DLL。 我一直在关注这些链接创建DLL:在Delphi中导入C#或C++ DLL作为COM对象

而这个链接(http://wiki.freepascal.org/LazActiveX)导入我创建的TLIB。 我创建的所有DLL都停止在Delphi中创建对象的地方。

我在C#创建的一个是:

using System; 
using System.Runtime.InteropServices; 
using System.IO; 
using System.Text; 
using System.Threading.Tasks; 

namespace CSharpSampleLib 
{ 
    [ComVisible(true), 
    Guid("CDBFD892-7473-4AC4-8B44-D75A828599AD")] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    public interface ICSharpCom 
    { 
     [DispId(1)] 
     void Init(); 
     [DispId(2)] 
     int AddNumbers(int num1, int num2); 
     [DispId(3)] 
     String StringConcat(String num1, String num2); 

    } 



    [Guid("D51F086B-B593-436D-8900-92CDC1E427CE"), 
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface CSharpCom_Events 
    { 
    } 
    [Guid("4AB74C5C-6F3C-4B15-9E00-5174551B50A2"), 
    ClassInterface(ClassInterfaceType.None)] 
    [ProgId("Sample.CSharpCom")] 
    [ComVisible(true)] 
    public class CSharpCom : ICSharpCom 
    { 
     public CSharpCom() { } 
     public void Init() { } 

     public int AddNumbers(int num1, int num2) 
     { 
      return num1 + num2; 
     } 
     public String StringConcat(String str1, String str2) 
     { 
      return str1 + str2; 
     } 
    } 
} 

我们尝试了两种选项调用我们导入的类型库。

program CSharpDemo; 

uses comobj, CSharpSampleLib_1_0_TLB; 
var 
    objCsLib1:ICSharpCom; 
    objCsLib2:OLEVariant; 

begin 
    objCsLib1:=CoCSharpCom.Create; // Method 1 
objCsLib2:= CreateOleObject('CSharpSampleLib.CSharpCom'); //Method 2 
end. 

方法1给出了: enter image description here 方法2给出了: enter image description here

我们Wow6432Node> CLSID> enter image description here

确信该库登记,发现GUID

我希望这是创建对象的正确方法。我可以知道我在这里错过了什么吗?

+0

错误消息很明显不是吗? –

+0

@DavidHeffernan感谢您的评论。但我认为我不清楚这个错误,我认为这个班是注册的。 –

+0

系统不会这样做。为什么不。 –

回答

0

- (VS)项目选项>应用程序>装配信息>使装配体COM可见检查?

- (VS)项目选项>生成>注册COM互操作检查?

- 用RegAsm.exe注册?

+0

谢谢。是的,我已经做了这些来建立DLL。类标题中给出了COMVisible标志。 –