在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类型,调用时并无抛出异常,但程序被迫自动退出!