1

アンマネージドvc++コードで処理されているマネージドvb.netコードからイベントを発生させています。以下はコード行です:

Dim pCALMarkups as Object
RaiseEvent RequestEISData(nOrdinal, pCALMarkups, eMarkupCreateSecurity, eMarkupModifySecurity, eMarkupDeleteSecurity, sUserNameSecurity)

pCALMarkupsオブジェクトは参照として渡され、アンマネージ vc++ コードで初期化されます。以下は、VB.NET でのイベントの宣言です。

 Public Event RequestEISData(ByVal nOrdinal As Short, <[In](), [Out]()> <MarshalAs(UnmanagedType.IDispatch)> ByRef pCALMarkups As Object, ByRef eMarkupCreateSecurity As Short, ByRef eMarkupModifySecurity As Short, ByRef eMarkupDeleteSecurity As Short, ByRef sUserNameSecurity As String)

以下は、 VC++でこのイベントを処理している関数です。

 void __stdcall OnRequestEISDataViewer(short nOrdinal, 
                                     IDispatch **pMarkups, 
                                     short *eMarkupCreateSecurity,
                                     short *eMarkupModifySecurity,
                                     short *eMarkupDeleteSecurity,
                                     BSTR *sUserNameSecurity)
{  CCALPageMarkups* pCalMarkups = new CComObject <CCALPageMarkups>;
   // CCALPageMarkups is a class declared in vc++ code
   // Some code for initializing pCalMarkups 
  *pMarkups = pCalMarkups;  //last line of code in this function 
}

コードのデバッグ中にOnRequestEISDataViewer関数にステップインできます。その関数内のすべてがエラーなしで実行されていますが、最後の行を実行した後に制御が関数から出てくると、以下のエラーが表示されます。

「マネージド デバッグ アシスタント 'InvalidVariant' は 'D:\Shared Folder\Workman code\UI\bin\WorkMan.exe' で問題を検出しました。追加情報: アンマネージド バリアントからマネージド オブジェクトへの変換中に、無効なバリアントが検出されました。無効な VARIANT を CLR に渡すと、予期しない例外、破損、またはデータ損失が発生する可能性があります"

では、 VB.NETコードでpCALMarupsオブジェクトをストロング タイプまたはマーシャリングして、このエラーを解決するにはどうすればよいでしょうか。または vc++ コードを変更する必要がありますか? どんな提案でも大歓迎です。

4

0 に答える 0