2016-11-25 6 views
1

私はDelphiをかなり新しくしています。私たちはC++またはC#のDLLをDelphiにインポートしようとしました。我々の要件は、COMオブジェクトとしてライブラリをインポートすることです。 DLLには複数のクラスと構造体があるので、メソッドをP/Invokeする必要はありません。 C++/C#とMFC ActiveX(ocxコンポーネント)でDLLを構築しようとしました。 私はDLLを作成するために、これらのリンクを、次のされています:DelphiでCOMオブジェクトとしてC#またはC++ DLLをインポート

と、このリンク(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; 
     } 
    } 
} 

我々は、インポートタイプライブラリを呼び出すために2つのオプションを試してみました。

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でGUIDを見つけた> CLSID> enter image description here

これはオブジェクトを作成する正しい方法だと思います。ここで私が何が欠けているのか分かりますか?

+0

エラーメッセージは十分にはっきりしていますか? –

+0

@DavidHeffernanコメントありがとうございます。しかし、私はエラーについて明らかではないと思う、私は登録されているクラスを参照してください。 –

+0

しかし、それはしません。何故なの。 –

答えて

0

- (VS)プロジェクトオプション>アプリケーション>アセンブリ情報>アセンブリのCOM表示をチェックしますか?

- (VS)プロジェクトオプション>ビルド> COM相互運用機能の登録を確認しましたか?

RegAsm.exeで登録しますか?

+0

です。そして、はい、DLLをビルドするためにこれらを行っています。 COMVisibleフラグは、クラスtitleで与えられます。 –

関連する問題