如何通过InvokeHelper将variant*传递给C#? 我有一个传统的C++组件,它消耗了类似性质的ATL控件。它使用progid创建ATL对象,并使用dispatchid使用InvokeHelper从ATL控件调用方法,如下所示 DISPID methodDispID; // dispatchid long lValue = 0; // first argument long short nIdx = 1 // second argument short VARIANT varValue; // third argument variant long returnCode = 0; // return code long static BYTE parms[] = VTS_I4 VTS_I2 VTS_PVARIANT; InvokeHelper(methodDispID, DISPATCH_METHOD, VT_ERROR, (void*)&returnCode, parms, &varValue, lValue, nIdx); < C++的ActiveX方法下面看, [id(1), helpstring("method GetValue")] long GetValue(long lValue, short nIdx,VARIANT *varValue);

如何通过InvokeHelper将variant*传递给C#? 我有一个传统的C++组件,它消耗了类似性质的ATL控件。它使用progid创建ATL对象,并使用dispatchid使用InvokeHelper从ATL控件调用方法,如下所示 DISPID methodDispID; // dispatchid long lValue = 0; // first argument long short nIdx = 1 // second argument short VARIANT varValue; // third argument variant long returnCode = 0; // return code long static BYTE parms[] = VTS_I4 VTS_I2 VTS_PVARIANT; InvokeHelper(methodDispID, DISPATCH_METHOD, VT_ERROR, (void*)&returnCode, parms, &varValue, lValue, nIdx); < C++的ActiveX方法下面看, [id(1), helpstring("method GetValue")] long GetValue(long lValue, short nIdx,VARIANT *varValue);,c#,c++,com,variant,dispatch,C#,C++,Com,Variant,Dispatch,现在我试图在C#中引入activex,这意味着我有一个Usercontrol,我将这个C#Usercontrol的progid提供给遗留组件,它创建C#Usercontrol的对象,并尝试调用C#Usercontrol的GeValue方法,该方法定义如下 C# 调用的是C#usercontrol的GetValue方法,但它抛出了异常 System.Runtime.InteropServices.COMException 在 System.RuntimeType.ForwardCallToInvo

现在我试图在C#中引入activex,这意味着我有一个Usercontrol,我将这个C#Usercontrol的progid提供给遗留组件,它创建C#Usercontrol的对象,并尝试调用C#Usercontrol的GeValue方法,该方法定义如下

C#

调用的是C#usercontrol的GetValue方法,但它抛出了异常

System.Runtime.InteropServices.COMException 在 System.RuntimeType.ForwardCallToInvokeMember(System.String, System.Reflection.BindingFlags,System.Object,Int32[], System.Runtime.Remoting.Proxies.MessageData ByRef)

我试图更改C#方法定义,如下所示,但没有任何效果

System.Int32 GetValue(System.Int32 lValue, System.Int16 nIdx,
                    [MarshalAs(UnmanagedType.Struct)]  ref object varValue);

System.Int32 GetValue(System.Int32 lValue, System.Int16 nIdx,
                     ref IntPtr varValue);
如何通过InvokeHelper将variant*传递给C#


注意:如果你想复制C++ COM代码:

,调用CuffKelHelp的组件代码应该是C++和C语言的USER控件

< P>相同的组件代码。
[id(1), helpstring("method GetValue")] 
long GetValue(long lValue, short nIdx,VARIANT *varValue);
…到c#,然后代替

System.Int32 GetValue(System.Int32 lValue, System.Int16 nIdx, ref object vCBValue);
……应该是:

object GetValue(System.Int32 lValue, System.Int16 nIdx);

这是因为所有C++的COM方法都返回一个HESREST(在您的情况下是长的),其他返回值都是通过<代码> OUT/<代码>参数。


在.NET中,不需要定义HRESULT,我们可以显式返回值,而不是使用
out

进行此更改后,也会引发相同的异常,而且我还有一个方法[id(2),helpstring(“method SetValue”)]long SetValue(VARIANT*Var,VARIANT*bstrVal,long lOrder,short nIdx);如何在C#中实现它?@RajeshSubramanian您是否也在C#中指定progid?通常您会在接口上执行此操作@MickyD是的,我在接口方法[DispID(1)]Int32 GetValue(System.Int32 lOrder,System.Int16 nIdx,object varval)中这样设置DispID@RajeshSubramanian我想你可以把这个问题变成一个新问题。听起来好像您在将c#类导出到接口中定义的GetValue函数时遇到了更大的问题?请显示完整的代码。@SimonMourier我已使用接口定义更新了问题。您可以尝试在接口中的GetValue中添加[PreserveSig]属性。@SimonMourier设置[PreserveSig]没有帮助:(我们需要完整的复制代码才能提供帮助。
object GetValue(System.Int32 lValue, System.Int16 nIdx);