读书人

C#控件的句柄传到C++的DLL中的有关问题

发布时间: 2013-03-28 10:20:24 作者: rapoo

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试试。

读书人网 >C#

热点推荐