グッドデイ仲間の開発者から**の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.
「ImySimpleCom」のコードをどのように作成していますか? p/invokeを使用していますか、.NETの組み込みCOM機能を使用していますか? –
'SimpleCOMLib.SimpleChatServer mySimpleCom = new SimpleCOMLib.SimpleChatServer(); SimpleCOMLib.ISimpleChatServer ImySimpleCom =(SimpleCOMLib.ISimpleChatServer)mySimpleCom; –
新しいインスタンスをどのように作成しているのか、私はクラスのコード自体をどのように生成していますか?以前のコメントを更新しましたが、リフレッシュする必要がありました。 –