某公司提供了一套摄像头接口,C++的,现在要用WinForm实现实时监控。其中有一个方法,定义为
int function_1(long _hwnd); 参数为一个控件的句柄。这个方法的目的是将传入的这个句柄所对应的控件进行一下处理。
这个方法在他提供的C++做的Demo中是好使的。
现在我在C#中调用:[DllImport("DLL\\xxx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string function_1(Int32 _control);//调用
IntPtr intptr = textBox1.Handle;
function_1(intptr.ToInt32()); //这里报错了
错误信息:尝试读取或写入受保护的内存,这通常指示其他内存已损坏。网上找了很多方法,都不管用,比如参数类型用IntPtr 或者ref IntPtr、long等等,都不管用。
哪位大神有解决方案?还有我想知道,C++控件的句柄和C#的句柄是不是因该是一个概念?都应该是一种指针?如果C#窗体的控件需要传递到C++的DLL中去处理,应该如何做?
int function_1(long _hwnd); 参数为一个控件的句柄。这个方法的目的是将传入的这个句柄所对应的控件进行一下处理。
这个方法在他提供的C++做的Demo中是好使的。
现在我在C#中调用:[DllImport("DLL\\xxx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string function_1(Int32 _control);//调用
IntPtr intptr = textBox1.Handle;
function_1(intptr.ToInt32()); //这里报错了
错误信息:尝试读取或写入受保护的内存,这通常指示其他内存已损坏。网上找了很多方法,都不管用,比如参数类型用IntPtr 或者ref IntPtr、long等等,都不管用。
哪位大神有解决方案?还有我想知道,C++控件的句柄和C#的句柄是不是因该是一个概念?都应该是一种指针?如果C#窗体的控件需要传递到C++的DLL中去处理,应该如何做?
int function_1(long _hwnd);
public static extern string function_1(Int32 _control);
这个和你的函数声明完全不一样啊,应该是:
public static extern int function_1(IntPtr _control); //返回类型不同,参数类型IntPtr和Int32应该都一样。
参考:http://msdn.microsoft.com/en-us/library/ac7ay120.aspx
另外注意CallingConvention
internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);来自:
http://www.pinvoke.net/default.aspx/user32/MoveWindow.html
的确是返回类型不一样,这里我写错了,没发现,现在改过来了,出现了新的问题:调试的时候传入句柄这句话F10过去了,但是调试被终止了,没有抛出任何异常。在Debug下直接运行exe,会报一个错误:---------------------------
xxxxx.exe - 系统错误
---------------------------
Exception Processing Message 0xc0000005 Parameters 0x7592592C 0x7592592C 0x7592592C 0x7592592C
---------------------------
确定
---------------------------
请问这是什么原因?