vsto插件在64位Office的一个异常---算术运算溢出(IntPtr转int)

来源:互联网 发布:西安行知小学 编辑:程序博客网 时间:2024/06/04 20:11

在vsto插件开发中,以前从没发现过这个问题,到了Office2013(64bit) ,历经艰辛跟踪到了这句:

SendMessage(this.Handle, WM_ALLOW_LOGIN, -1, (int)ptr);

其中ptr为IntPtr类型,SendMessage为API,声明如下:

public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

跟踪到的异常信息为“算术运算导致溢出。”致使插件关键功能无法使用!查了下原因:

http://www.cnblogs.com/shouzheng/archive/2012/04/13/2445819.html 这篇文章给出了问题产生的原因,但个人觉得并非全部。

是,该问题可以得到解决,我的解决方案是把API原型改为

public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, long lParam);

调用时:

SendMessage(this.Handle, WM_ALLOW_LOGIN, -1, (long)ptr);

 

而且换成long之后,无论在32位还是64位都可以得到成功运行。

但是我想知道的是:在没换成long之前,也就是int,为何在64位系统+64位Office2010环境下确不会出现异常!!以至于插件用这么久都不曾出现过该问题

这个又作何解释呢??

 

PS: 若把API原型参数wParam改为long类型,调用时并无抛出异常,但程序被迫自动退出!

原创粉丝点击