2011-01-19 7 views
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チュートリアルに従ってきましたが、そこには何のヒントもありません。 =) 必要なものをお尋ねください!

答えて

2

GetTimestampのIDL定義に[out]属性がパラメータに添付されていることを確認しましたか?

+0

私は今あります。 =)はい、idlの定義は次のようになります: '[id(1)] HRESULT GetTimestamp([out] ULONGLONG * tsc); – Jens

+0

これはC#の等価なコードと少し奇妙です(Activator.CreateInstance(Type.GetTypeFromProgId )))が働きます。 AutomationFactory.CreateObjectのmsdnサポートページは、マーシャリングパラメータに関して完全には機能していないことを示唆しています。それはrefで引数を渡すことをサポートしていると言います - これは渡されるメモリアドレスへの書き込みを除外するかもしれません。 – Jimmy

+1

すぐに回避策として[retval]を使用してタイムスタンプを戻り値として関数に返すことができます。 – Jimmy

関連する問題