将vb.net对象byref传递给非托管代码

时间:2013-08-06 10:35:20

标签: vb.net visual-c++ marshalling marshalbyrefobject

我正在使用托管的 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 ++代码? 任何建议都表示赞赏。

0 个答案:

没有答案