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

本文探讨了在VSTO插件开发中遇到的发送消息API调用导致的溢出异常问题。通过更改参数类型从int到long,解决了64位系统下出现的问题,并保持了32位系统的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值