时间:2019-04-01 标签:c#com object can't get ref object values

Posted

技术标签:

【中文标题】时间:2019-04-01 标签:c#com object can\'t get ref object values【英文标题】:c# com object cant get ref object values时间:2019-04-01 标签:c#com object can't get ref object values 【发布时间】:2013-01-26 02:52:00 【问题描述】:

我们正在尝试从 COM 对象中获取返回值,函数是:

bool AxSB100BPC.GetEnrollData(int dwMachineNumber,
int dwEnrollNumber,
int dwEMachineNumber,
int dwBackupNumber,
ref int dwMachinePrivilege,
ref object dwEnrollData,
ref int dwPassWord

我们称这个函数为:

vRet = axSB100BPC1.GetEnrollData(mMachineNumber,
                                 vEnrollNumber,
                                 vEMachineNumber,
                                 vFingerNumber,
                                 ref vPrivilege,
                                 ref oglngEnrollData,
                                 ref glngEnrollPData);

问题在于oglngEnrollData,它是ref object 的类型。它被声明为object oglngEnrollData;

错误是:

System.Runtime.InteropServices.COMException 未处理
H结果=-2147352571
消息=Tür uyuşmazlığı。 (来自 HRESULT 的异常:0x80020005 (DISP_E_TYPEMISMATCH))
源=mscorlib
错误代码=-2147352571
堆栈跟踪:
   在 System.RuntimeType.ForwardCallToInvokeMember(字符串成员名称、BindingFlags 标志、对象目标、Int32 [] aWrapperTypes、MessageData 和 msgData)
   在 SB100BPCLib._DSB100BPC.GetEnrollData(Int32 dwMachineNumber, Int32 dwEnrollNumber, Int32 dwEMachineNumber, Int32 dwBackupNumber, Int32& dwMachinePrivilege, Object& dwEnrollData, Int32& dwPassWord)
   在 AxSB100BPCLib.AxSB100BPC.GetEnrollData(Int32 dwMachineNumber,Int32 dwEnrollNumber,Int32 dwEMachineNumber,Int32 dwBackupNumber,Int32& dwMachinePrivilege,Object& dwEnrollData,Int32& dwPassWord)
   在 f:\enrolldata\Form1.cs:line 196 中的enrolldata.Form1.button2_Click(Object sender, EventArgs e)
   在 System.Windows.Forms.Control.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件)
   在 System.Windows.Forms.Control.WmMouseUp(消息和 m,MouseButtons 按钮,Int32 点击)
   在 System.Windows.Forms.Control.WndProc(消息和 m)
   在 System.Windows.Forms.ButtonBase.WndProc(消息和 m)
   在 System.Windows.Forms.Button.WndProc(消息和 m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m)
   在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
   在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(味精和味精)
   在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID,Int32 原因,Int32 pvLoopData)
   在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 原因,ApplicationContext 上下文)
   在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 原因,ApplicationContext 上下文)
   在 System.Windows.Forms.Application.Run(窗体 mainForm)
   在 f:\enrolldata\Program.cs:line 19 中的enrolldata.Program.Main()
   在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数)
   在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args)
   在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
   在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx)
   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx)
   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态)
   在 System.Threading.ThreadHelper.ThreadStart()
  内部异常:

欢迎任何想法

【问题讨论】:

糟糕的手册。我猜 byte[] 有 1416 个元素长,或者 int[] 有 354 个元素长。 secubio.com/upload/file/1292045533.pdf如果您无法弄清楚,请致电供应商。 谢谢@HansPassant,我的情况似乎是354; ` 常量 int DATASIZE = 354; //(1404 + 12) / 4;` 【参考方案1】:

另一个论坛上的这个question 似乎正在处理相同界面的相同问题。

这只是基于该线程的猜测,但问题似乎是dwEnrollData 参数实际上是一个变体类型(不是托管System.Object 类型)在这种情况下您应该尝试使用System.Runtime.InteropServices.VariantWrapper将要传递的参数值包装到方法中。

【讨论】:

谢谢@mike,试过了:int glngEnrollData; object var = new System.Runtime.InteropServices.VariantWrapper(glngEnrollData);,但得到了:Error 1 A field initializer cannot reference the non-static field, method, or property 'enrolldata.Form1.glngEnrollData' F:\enrolldata\Form1.cs 28 72 enrolldata

以上是关于时间:2019-04-01 标签:c#com object can't get ref object values的主要内容,如果未能解决你的问题,请参考以下文章

时间:2019-04-01 标签:c#regexsplitbinarystring

时间:2019-04-01 标签:c#read/editaccdb宏

时间:2019-04-01 标签:c#mongodb database collection find

时间:2019-04-01 标签:c#swagger openapi erronous refs when nested classes

[Intern][2019.04.01]Linux 学习心得

Bilibili弹幕姬使用obs的一些证据之类的