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 转换为托管对象期间检测到无效 VARIANT . 将无效的 VARIANT 传递给 CLR 可能会导致意外异常、损坏或数据丢失”

那么如何在VB.NET代码中进行强类型或 Marshal pCALMarups对象,以便解决此错误?还是我必须更改 vc++ 代码?任何建议表示赞赏。

4

0 回答 0