c++ 头文件声明:
extern "C" __declspec(dllexport)  bool WINAPI MySkin(HWND hWnd,HBITMAP hBmpScroll);cpp 实现
extern "C" bool WINAPI MySkin(HWND hWnd,HBITMAP hBmpScroll)
{
        CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
MySkinImp(pWnd,hBmpScroll);
return true;
}C#调用方式:
声明:
[DllImport("dll4net.dll")]
        public static extern Boolean MySkin(int hWnd, IntPtr hBmpScroll);调用:
try
            {
                Bitmap bm = new Bitmap("skin.bmp");
                IntPtr ipbm = bm.GetHbitmap();
                IntPtr ipTextBoxHandle = this.textBox1.Handle;             
                MySkin(ipTextBoxHandle.ToInt32(), ipbm);//这句报错   
            }执行,报错在 System.AccessViolationException 中第一次偶然出现的“myn.exe”类型的异常
请问是传入参数不对吗?该如何传?
      

解决方案 »

  1.   

    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct HWND__ {
        
        /// int
        public int unused;
    }[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct HBITMAP__ {
        
        /// int
        public int unused;
    }public partial class NativeMethods {
        
        /// Return Type: boolean
        ///hWnd: HWND->HWND__*
        ///hBmpScroll: HBITMAP->HBITMAP__*
        [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="MySkin")]
        [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.I1)]
    public static extern  bool MySkin(System.IntPtr hWnd, System.IntPtr hBmpScroll) ;}
      

  2.   

    谢谢,你这两个struct在哪儿用到了啊?
    另外没有UnmanagedType.I1这个类型.这是为了兼容返回的bool值吗?
      

  3.   

    使用IntPtr进行封送处理。 cppfaq的回答是正确的。
    如果你还不明白怎么做,我推荐你阅读刚刚出版的新书:《精通.NET互操作P/Invoke,C++Interop和COM Interop》,这本书详细且系统地介绍了.NET互操作的三种主要技术:P/Invoke,C++ Interop和COM Interop,你需要的问题在第2章“数据封送”中能找到解答。 
    该书的官方网站: 
    www.interop123.com 豆瓣网信息: 
    http://www.douban.com/subject/3671497/