日期:2014-05-17  浏览次数:20839 次

C#控件的句柄传到C++的DLL中的问题
某公司提供了一套摄像头接口,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中去处理,应该如何做?

------解决方案--------------------
个人感觉两个语言的句柄应该是一样的。但C++本人不熟。如果说的不对权当顶帖了吧。
------解决方案--------------------
CallingConvention 不知道对不对,自己看原来的API。
int function_1(long _hwnd);
public static extern string function_1(Int32 _control);
这个和你的函数声明完全不一样啊,应该是:
public static extern int function_1(IntPtr _control); //返回类型不同,参数类型IntPtr和Int32应该都一样。
------解决方案--------------------
返回值应该是int, 参数既然对方是long 你用Int应该没有问题。
参考:

http://msdn.microsoft.com/en-us/library/ac7ay120.aspx
另外注意CallingConvention 

------解决方案--------------------
句柄是可以传的,这是调用windows API MoveWindow的声明:

[DllImport("user32.dll", SetLastError = true)]
    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
------解决方案--------------------
这个,我真不会
------解决方案--------------------
正常传HANDLE的话,都是用IntPtr
------解决方案--------------------
那你换个类型试试
------解决方案--------------------
这显然 和调用没关系,而是你调用的DLL 本身实现有问题。 你可以在C语言里面调用该DLL试试。