今天这事儿真是把我给折腾坏。搞一整天,发现是个COMException的问题,真的是头都大。我这程序跑得好好的,突然就给我罢工,报个错,说是“*.COMException”,还说什么“被调用的对象已与其客户端断开连接”。我当时就懵,这啥玩意儿?完全摸不着头脑。
我寻思着,这问题肯定不简单,得好好查查。我就开始各种倒腾,各种试。我还以为是网络问题,毕竟有时候网络不稳定,也会导致一些奇奇怪怪的问题。我就把网线拔又插,路由器也重启好几遍,结果还是没用。这下我更郁闷,这也不是,那也不是,到底咋回事?
然后,我就开始在网上各种搜,看看有没有遇到类似问题的朋友。你别说,还真让我找到一些相关的帖子。有的说是啥“无状态服务结构”里返回对象图时会出这种问题,有的说是访问啥Active Directory时出现,还有的说可能是互操作性问题,总之是五花八门,啥说法都有。看得我是眼花缭乱,脑袋都大。其中有个啥“DirectoryServicesCOMException”的玩意,看下,我这好像没用到这玩意。
我还看到有人提到啥“获取用户的登录ID”,我这里也没这个操作,怎么会报这个错。还有一个,是说在啥PowerPoint加载项里调用啥“*()”时也会有这个COMException错误,说是接口啥的问题。我这里也不是PowerPoint加载项,八竿子打不着边。
后来我冷静下来,仔细想想,觉得这问题可能是出在我程序里某个地方跟别的组件交互的时候。我就开始一段一段地排查代码,看看哪里有跟外部组件交互的地方。这一查,还真让我发现点猫腻。我发现有一段代码,在处理一个COM对象的时候,没有正确地释放资源。我想,这可能就是问题的根源!
- 第一步: 我先把那段代码给注释掉,然后重新运行程序。你猜怎么着?程序居然正常运行!看来问题就是出在这里。
- 第二步: 我就开始仔细研究这段代码,看看怎么才能正确地释放COM对象。我查好多资料,发现原来COM对象得用特定的方法来释放,不能随便就丢在那里不管。
- 第三步: 按照资料上说的,我在代码里加几行释放COM对象的代码,然后再次运行程序。这回程序终于完美运行,再也没有出现那个讨厌的COMException错误。
这事儿真是给我上一课。以后写代码,一定要注意资源的释放,特别是这种跟外部组件交互的时候,更要小心谨慎。不然,一个小小的疏忽,就可能导致大大的麻烦。不过话说回来,通过这回排查问题,我对COM对象也有更深的解,也算是因祸得福。
这回遇到的问题,总的来说是啥COMException异常,然后程序崩溃,不过最终还是解决。以后再遇到这类问题,至少心里有底,知道该从哪些方面入手排查。