C# 为什么我在呼叫OCX C+时遇到问题+;使用C编写代码#
使用C#调用OCX方法时出现问题。OCX组件是在C++开发的.</P> 我得到这个错误:C# 为什么我在呼叫OCX C+时遇到问题+;使用C编写代码#,c#,c++,com,interop,ocx,C#,C++,Com,Interop,Ocx,使用C#调用OCX方法时出现问题。OCX组件是在C++开发的. 我得到这个错误: "System.Runtime.InteropServices.COMException (0x80020005): Los tipos no coinciden. (Excepción de HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))\r\n en System.RuntimeType.ForwardCallToInvokeMember(String
"System.Runtime.InteropServices.COMException (0x80020005): Los tipos
no coinciden. (Excepción de HRESULT: 0x80020005
(DISP_E_TYPEMISMATCH))\r\n en
System.RuntimeType.ForwardCallToInvokeMember(String memberName,
BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData&
msgData)\r\n en
MFCActiveXControl1Lib._DMFCActiveXControl1.LeoCadena(IntPtr
nombreFichero, IntPtr contenidoFichero, Int32 LongitudFichero)\r\n
en AxMFCActiveXControl1Lib.AxMFCActiveXControl1.LeoCadena(IntPtr
nombreFichero, IntPtr contenidoFichero, Int32 longitudFichero) en
c:\\Temp\\PrinterManager\\Test\\MFCActiveXControl1\\Debug\\AxMFCActiveXControl1Lib.cs:línea
43\r\n en TestPrinterManager.Form1.button2_Click(Object sender,
EventArgs e) en
C:\\Temp\\PrinterManager\\Test\\TestPrinterManager\\TestPrinterManager\\Form1.cs:línea
77"
C++签名是:
*void flushFiles();
LONG LeoCadena(unsigned char * nombreFichero,
unsigned char * contenidoFichero,
int LongitudFichero);*
我已修改生成的visual studio包装,以便导出的方法为:
IL文件:
*void flushFiles()
int32 LeoCadena(native int nombreFichero,
native int contenidoFichero,
int32 LongitudFichero)*
cs文件:
*public virtual void flushFiles()
public virtual int LeoCadena(System.IntPtr nombreFichero, System.IntPtr contenidoFichero, int
longitudFichero)*
当我使用C#调用该方法时,我使用了以下代码:
*string file_xml = @"C:\proyectos\fichero.xml";
string texto_xml;
System.IO.StreamReader sr = new System.IO.StreamReader(file_xml);
texto_xml = sr.ReadToEnd();
sr.Close();
sr.Dispose();
byte[] arr = Encoding.ASCII.GetBytes(texto_xml);
int longitud = arr.Length;
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * arr.Length);
Marshal.Copy(arr, 0, ptr, longitud);
axMFCActiveXControl1.LeoCadena(ptr, ptr, longitud);
Marshal.FreeHGlobal(ptr);*
你知道我为什么会犯这个错误吗
我使用32位平台和.NETFramework4.5.2(未翻译)错误表示类型是错误的,实际上是错误的。您没有调用C++代码,而是调用COM代码。COM字符串不是
字符*
。事实上,C++中使用C风格字符串是一个非常糟糕的想法。在COM中,字符串是Unicode(UTF16)。这段代码中的问题太多了。看起来根本没有COM相关的指南或C++库。即使使用OCX也很奇怪——这是一个UI组件。为什么要从后台代码调用UI组件?当您拥有适当的COM库(无论是OCX还是DLL)时,您不会像导入C函数一样导入这些函数。您可以像使用.NET库一样使用这些类型和方法。您想做什么?如果您只想从.NET调用一个C函数,那么COM就太过分了。创建COM组件非常复杂,如果不使用像这样的库就很难做到。你说的“IL”文件是什么意思?你是说IDL吗?您不能更改IDL,但要保持C/C++签名不变。PS:@PanagiotisKanavos-您可以将C风格参数char*完美地用于COM。你可能把COM和COM“自动化”混淆了(IDispatch、VARIANT、BSTR、TLB等,它们实际上可以限制数据类型,但它只是COM的超集,在这里可能确实有用)。@SimonMourier是的,IDL卡住了键盘。至于c风格的弦乐,是的,我记得21年前是这样的。这在当时是一个糟糕的想法,但如今要糟糕得多,除非你在Windows-95系列中。然后这简直太糟糕了,导致了大量的代码页转换问题。在Windows NT的Unicode操作系统中,使用char*
会带来严重的麻烦。