0
現在、昇格された権限を持つSilverlight 4 Out-Of-Browserアプリケーションからアンマネージコードを呼び出そうとしています。SilverlightでCOMオートメーションを使用してアンマネージコードから戻り値を取得する方法は?
単純なテストコードがArgumentExceptionで失敗します。
try
{
dynamic watch = AutomationFactory.CreateObject("WatchCOMLib.HighPerformanceWatch");
// Displays ...AutomationMetaObjectProvider
MessageBox.Show(watch.ToString());
// Fails with ArgumentException: Could not convert an argument for the call to GetTimestamp
ulong tsc;
watch.GetTimestamp(out tsc);
MessageBox.Show(tsc.ToString());
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
Visual Studio 2010のATLテンプレートウィザードを使用してCOMライブラリを作成しました。私は単純にキーワードを指定せずにGetTimestampにTSCを渡すときの方法は、例外がスローされない
STDMETHODIMP CHighPerformanceWatch::GetTimestamp(ULONGLONG* tsc)
{
// ....
*tsc = result; // result is unsigned __int64
return S_OK;
}
ように見えるが、TSCは変更されません。 ...管理されていないライブラリから値を戻すにはどうすればよいですか?
ここでは、情報が不足している可能性があります。私は、このCOMライブラリを作成するためのいくつかのHello-Worldチュートリアルに従ってきましたが、そこには何のヒントもありません。 =) 必要なものをお尋ねください!
私は今あります。 =)はい、idlの定義は次のようになります: '[id(1)] HRESULT GetTimestamp([out] ULONGLONG * tsc); – Jens
これはC#の等価なコードと少し奇妙です(Activator.CreateInstance(Type.GetTypeFromProgId )))が働きます。 AutomationFactory.CreateObjectのmsdnサポートページは、マーシャリングパラメータに関して完全には機能していないことを示唆しています。それはrefで引数を渡すことをサポートしていると言います - これは渡されるメモリアドレスへの書き込みを除外するかもしれません。 – Jimmy
すぐに回避策として[retval]を使用してタイムスタンプを戻り値として関数に返すことができます。 – Jimmy