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

手抓宝 2013-03-21 08:19:16
某公司提供了一套摄像头接口,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中去处理,应该如何做?
...全文
410 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2013-03-22
  • 打赏
  • 举报
回复
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应该都一样。
手抓宝 2013-03-22
  • 打赏
  • 举报
回复
参数这已经没有问题了,用Int32和IntPtr传都没有问题,都能返回正确的东西,现在就是异常了,调试时无法抛出,貌似不是程序的异常。
手抓宝 2013-03-22
  • 打赏
  • 举报
回复
To:#2、#3 的确是返回类型不一样,这里我写错了,没发现,现在改过来了,出现了新的问题: 调试的时候传入句柄这句话F10过去了,但是调试被终止了,没有抛出任何异常。在Debug下直接运行exe,会报一个错误: --------------------------- xxxxx.exe - 系统错误 --------------------------- Exception Processing Message 0xc0000005 Parameters 0x7592592C 0x7592592C 0x7592592C 0x7592592C --------------------------- 确定 --------------------------- 请问这是什么原因?
三五月儿 2013-03-22
  • 打赏
  • 举报
回复
那你换个类型试试
xili刘大大爷 2013-03-22
  • 打赏
  • 举报
回复
正常传HANDLE的话,都是用IntPtr
xiongboss520 2013-03-22
  • 打赏
  • 举报
回复
这个,我真不会
宝_爸 2013-03-22
  • 打赏
  • 举报
回复
句柄是可以传的,这是调用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
宝_爸 2013-03-22
  • 打赏
  • 举报
回复
返回值应该是int, 参数既然对方是long 你用Int应该没有问题。 参考: http://msdn.microsoft.com/en-us/library/ac7ay120.aspx 另外注意CallingConvention
卡尼尔爽肤水 2013-03-22
  • 打赏
  • 举报
回复
这显然 和调用没关系,而是你调用的DLL 本身实现有问题。 你可以在C语言里面调用该DLL试试。
我是小李 2013-03-21
  • 打赏
  • 举报
回复
个人感觉两个语言的句柄应该是一样的。但C++本人不熟。如果说的不对权当顶帖了吧。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧