C++からC#コードを呼び出そうとしています。そこで私はCOM Interopの方法を選択しました。今、私はC#のコードがあります。私はこのコンパイルをしようとするとC#からC#を呼び出し、戻り値
namespace ToBeCalled
{
[Guid("9329feaf-b293-4093-a7d8-6128f52b30a6")]
[ComVisible(true)]
public interface IInterface
{
int Write(string toWrite);
}
}
namespace ToBeCalled
{
[Guid("e4105e40-2d6b-4b7c-ae42-d2f9c405a2a0")]
[ComVisible(true)]
public class ClassYouWantToUse : IInterface
{
public int Write(string toWrite)
{
System.Console.WriteLine(toWrite);
return 1;
}
}
}
とC++コード
#import "...\\ToBeCalled.tlb"
int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ToBeCalled::IInterfacePtr piTest(__uuidof(ToBeCalled::ClassYouWantToUse));
long lResult = 0;
// Call the Add method.
piTest->Write("hi", &lResult);
wprintf(L"The result is %d\n", lResult);
// Uninitialize COM.
CoUninitialize();
return 0;
}
を、もちろんそれは、Writeは2つの引数を取らないことを言います。私はMSDNを見ました。ここでは、このような例があり、このように戻り値を取ります。だから私の質問は、どのように私は関数の戻り値を取得できますか?電話を
piTest->Write("hi");
に更新すると、未処理の例外で実行が失敗します。戻り値なしでこの例を試したとき、メソッドの戻り値の宣言が無効であるため、すべてが正常に機能します。
私はパラメータをc#に追加する必要があることを発見しました。次に、結果値を持つ関数に2番目の引数を使用できます。さて、Intのために問題は解決しましたが、どうすればこのような文字列を送ることができますか? –
'[out]'パラメータではなく、通常は値を返すことができます。まさに例外は何ですか?あなたはマネージドコールをデバッグしましたか? –