2016-11-03 4 views
0

グッドデイ仲間の開発者から**のparams BSTR *とBSTRで、レガシーC++ DLLインターフェイスメソッドを呼び出しますと、私は成功のないサンプルをたくさん試しました。しかし、それは私がすべてのサイトをカバーしたという意味ではありません - 私は片目で目が見えず、もう片方を見ることができないと考えています。は、どのように私は私が必要なものを行う方法に今2日間インターネットを検索されている</p> <p>C#

いずれにしても、COM Automation Interface定義を含む紙を1枚手渡し、それに応じてインターフェイスとコールバックを利用するC#アプリケーションを開発するように求められました。

ので、起動(またはそう思った)シンプル - C++メソッドのシグネチャは次のとおりです。

STDMETHODIMP CSimpleChatServer::CallMe(BSTR clientName, BSTR** returnMessage)

とのインタフェースシグネチャは次のとおりです。

HRESULT _stdcall CallMe([in] BSTR clientName, [in] BSTR** helloMessage);

そして、私が呼び出す必要がありますこれはC#から - 私はISimpleChatServerのためのインターフェイスを確立しました。したがって、私が試みているコード呼び出しは同じです。

string rtrnMsg = string.Empty; ImySimpleCom.CallMe("Robert", rtrnMsg)

署名が[中]、私は保護されたメモリにアクセスしようとする上での例外を取得していなので。

今、私はそれが第2パラメータとしてIntPtrを望んでいると信じています。しかし、それを得るためのすべての私の試みは失敗しました。

ライブラリーを変更できないことに注意してください。ライブラリーを変更することはできません。これは少し時間をかけて利用する必要がある「現状の」レガシーインターフェースであり、彼らはそれに取り組む誰も持っていないと思う)。

助けを歓迎します。あなたが文字列を返すとき

種類よろしく、ロバートS.

+0

「ImySimpleCom」のコードをどのように作成していますか? p/invokeを使用していますか、.NETの組み込みCOM機能を使用していますか? –

+0

'SimpleCOMLib.SimpleChatServer mySimpleCom = new SimpleCOMLib.SimpleChatServer(); SimpleCOMLib.ISimpleChatServer ImySimpleCom =(SimpleCOMLib.ISimpleChatServer)mySimpleCom; –

+0

新しいインスタンスをどのように作成しているのか、私はクラスのコード自体をどのように生成していますか?以前のコメントを更新しましたが、リフレッシュする必要がありました。 –

答えて

1

の.idlではインターフェースは

HRESULT _stdcall CallMe([in] BSTR clientName, 
         [out,retval] BSTR** helloMessage); 

だからCallMe

から
SimpleChatServer mySimpleCom = new SimpleChatServer(); 
string helloMessage = mySimpleCom(clientName); 

を戻り値を取るべきですSysAllocStringを使って割り当てたC++/Cのメソッドを呼び出し、helloMessageに代入して呼び出し元に返します。

すなわち

*helloMessage = SysAllocString(L"MyString"); 

上記のすべては、あなたのC#プロジェクトでCOMサーバーを参照していることを前提としています。

私は今あなたの質問をより慎重に読んでいますので、 "レガシー"コードを変更することはできません。それが言うならば

HRESULT _stdcall CallMe([in] BSTR clientName, 
         [in] BSTR** helloMessage); 

それは正しくないので、変更する必要があります。私は最終的にクライアントとの接触を持って、はい、彼らは、提供された情報が不正確であったと属性[中]になるはずだった

すべてのアンドレス[outは、RETVAL]バックパッシングを可能にする

+0

HEHE - それは私が考えたことであり、私は彼らにそれを伝えました。そこには「それは何なのですか」という応答がありました。さて、技術的に - そして私が思ったように、私が2番目のパラメータで返そうとしているものに到達するためには、それが '[out、retval]'パラメータ属性を持つように何かを修正する必要があります。 –

+0

@RobertSpringer少なくとも、[in] [in] 'のままであれば関数を呼び出すときにおそらくメモリリークが発生します –

0

感謝文字列の - それを修正したら、すべてうまくいった。

ありがとうございました

関連する問題

 関連する問題