Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我在呼叫OCX C+时遇到问题+;使用C编写代码#_C#_C++_Com_Interop_Ocx - Fatal编程技术网

C# 为什么我在呼叫OCX C+时遇到问题+;使用C编写代码#

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

使用C#调用OCX方法时出现问题。OCX组件是在C++开发的.</P> 我得到这个错误:

"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*
会带来严重的麻烦。