某公司提供了一套摄像头接口,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中去处理,应该如何做?

解决方案 »

  1.   

    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应该都一样。
      

  2.   

    返回值应该是int, 参数既然对方是long 你用Int应该没有问题。
    参考:http://msdn.microsoft.com/en-us/library/ac7ay120.aspx
    另外注意CallingConvention 
      

  3.   

    句柄是可以传的,这是调用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
      

  4.   

    正常传HANDLE的话,都是用IntPtr
      

  5.   

    To:#2、#3
    的确是返回类型不一样,这里我写错了,没发现,现在改过来了,出现了新的问题:调试的时候传入句柄这句话F10过去了,但是调试被终止了,没有抛出任何异常。在Debug下直接运行exe,会报一个错误:---------------------------
    xxxxx.exe - 系统错误
    ---------------------------
    Exception Processing Message 0xc0000005 Parameters 0x7592592C 0x7592592C 0x7592592C 0x7592592C
    ---------------------------
    确定   
    ---------------------------
    请问这是什么原因?
      

  6.   

    参数这已经没有问题了,用Int32和IntPtr传都没有问题,都能返回正确的东西,现在就是异常了,调试时无法抛出,貌似不是程序的异常。
      

  7.   

    这显然 和调用没关系,而是你调用的DLL 本身实现有问题。 你可以在C语言里面调用该DLL试试。