我正在使用托管的 vb.net 代码搜索一个事件,该代码正在非托管 vc ++ 代码中处理。以下是代码行:
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 ++代码? 任何建议都表示赞赏。