平台调用,出现 System.AccessViolationException

chinadrencher 2009-04-03 12:31:05
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”类型的异常
请问是传入参数不对吗?该如何传?


...全文
317 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaomiyinerzhou 2009-05-13
  • 打赏
  • 举报
回复
使用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/
cppfaq 2009-04-03
  • 打赏
  • 举报
回复
[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) ;

}
chinadrencher 2009-04-03
  • 打赏
  • 举报
回复
谢谢,你这两个struct在哪儿用到了啊?
另外没有UnmanagedType.I1这个类型.这是为了兼容返回的bool值吗?

110,525

社区成员

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

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

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