2010-11-24 9 views
3

私たちはクライアントのexeをC#で作成しています.COM dllと1つのネイティブC++静的ライブラリで書かれたレガシーコードがあります。 C#クライアントの機能を完成させるためには、両方を使用する必要がありました.C#コード内でCOMクラスのインスタンスを作成できるように、interopを使用してCOM dllへの参照を追加しました。今このCOMクラスメソッドは、nactive C++のオブジェクトである引数をとります。COM クラスのメソッドの中には、C++静的ライブラリで宣言されたクラスのオブジェクトである引数を必要とするものがあります。 C#でC++ネイティブクラスのインスタンスを作成できないため、ネイティブクラスにC++/CLIラッパーを作成し、C#コードでワーカーのインスタンスを作成し、ネイティブクラスのインスタンスに ワーパ経由でアクセスし、COMクラスに渡すことにしましたC#クライアントで作成されます。問題は、ネイティブオブジェクトポインタ(IntPtrとして)をCOMクラスに渡すときに、ネイティブオブジェクトをその値に初期化しないことです。何が問題なの?マネージC++ラッパーを使ってネイティブオブジェクトをC#コードに戻す方法は?C++ラッパーを使用したマネージコードのネイティブC++インスタンス

//Natvie C++ class 
class __declspec(dllexport) CConfiguration 
{ 

    public : 
     CConfiguration(void); 
     virtual ~CConfiguration(void); 
     void SetIPAddress(const char *IPAddress); 
     void SetPort(const char*Port); 
     void GetIPAddress(char *IPAddress); 
     void GetPort(char *Port); 
    Private: 
     std::string IPAddress; 
     std::string Port; 

} 


//Managed C++ Class 
public ref class ManagedConfigruation 
{ 
     public : 
     ManagedConfigruation(){} 
     ~ManagedConfigruation(){} 
     CConfiguration *myConfiguration;   
       IntPtr GetObjectOfConfigurationPtr();  
} 

IntPtr ManagedConfigruation::GetObjectOfConfigurationPtr() 
{ 
    myConfiguration = new CConfiguration(); 
    myConfiguration.SetIPAddress("127.0.0.1"); 
    myConfiguration.SetPort("6200"); 
    //Convert native object to IntPtr and return to C# class 
    return System::IntPtr(myConfiguration); 
}; 

//C# class on client exe 
public class CSharpClass 
{ 

    //Wrapper of Managed C++ class 
    ManagedConfiguration objManagedConfiguration = new ManagedConfiguration(); 
    IntPtr objPtr = objManagedConfiguration.GetObjectOfConfigurationPtr(); 

    //Belwoo COMObject needs object of type CConfiguration native C++ class  
    COMObject.Initialize(objPtr); //Here is the problem object does not contain anything 


} 
+0

'COMObject.Initialize(objPtr)'を読んではいけませんか? –

+0

おかげでそれを修正しました –

答えて

1

COMメソッドではありませんオートメーション互換。非常に珍しいことですが、COMメソッドはこの種のシナリオでCOMインターフェイスポインタをとります。型ライブラリが変換された後に、Object Browserでどのように見えるかを確認することをお勧めします。引数型がのオブジェクトであるときに問題が発生しました。

C++/CLIでCOMインターフェイスコードを保持する方がよい場合があります。

0

初期化はCOMメソッドではなく、独自のメソッドであり、実際にネイティブのC++オブジェクトであるIntPtrを引数としてとります。

関連する問題