http://code.msdn.microsoft.com/office/CppAutomateOutlook-55251528声明:
..。它非常强大,但通常不推荐使用,因为与Microsoft应用程序一起使用时通常会出现引用计数问题。..。
这里具体指的是哪些参考计数问题?例如,它是否适用于特定的示例?
类似于在示例中,我只想打开Outlook,创建一个约会,完成。
我想用“导入”,但这句话让我害怕.
发布于 2014-01-30 08:48:20
当两个或多个对象直接或间接地相互保存引用时,就会发生循环参考。在COM中,这意味着循环链接的对象相互调用IUnknown::AddRef
。
如果使用Excel自动化,如果将事件处理程序(接收器)连接到Excell对象源事件(通过IConnectionPoint::Advise
),则可能会发生这种情况。这样,您可以保持对例如Application
对象的引用,而Application
对象则保留对接收器的引用。
此问题不特定于由VC++ #import
指令生成的智能指针。这关系到当您不再需要COM对象时如何处理它们的关闭。您应该显式地中断您已经建立的所有连接(例如,做IConnectionPoint::Unadvise
),并调用对象可能公开的任何显式关闭API (例如,Workbook::Close
或Application::Quit
)。然后,您应该显式地释放引用(例如,在智能指针上调用workbookPtr.Release()
)。
也就是说,如果您不处理Excel提供的任何COM事件,您不应该太担心,创建循环引用的可能性将很低。此外,Excel是一个进程外的COM服务器,COM有一些垃圾收集逻辑来管理进程外服务器的生命周期.但是,当您的应用程序仍然处于打开状态时,Excel进程将保持活动状态,直到释放对其对象的所有引用或调用Application::Quit
为止。
发布于 2014-01-30 14:29:28
太荒谬了。程序设计办公室在#import的帮助下互操作是样板和推荐的方法。它自动生成的智能指针类型显式地用于为您自动完成引用计数,因此您不能忘记调用Release()。有一些锋利的边缘,你必须明白什么是智能指针可以做的和不做的。
否则,对于支持“全一代码框架”的团队来说,这是相当正常的。这些示例是由上海的一个支持团队创建的,最初的任务是在MSDN论坛上提供帮助。这些家伙没有你所期望的微软程序员在Redmond工作的凭证,他们的代码片段也没有被审查过。其中一些人的想法完全是错误的。如果你曾经在MSDN论坛上问过问题,看到他们发布的答案,那么你就知道我的意思了。
他们的Solution2.cpp示例通过IDispatch使用后期绑定。这无疑是与Office交互的困难方式,在编写代码时,您将得不到任何帮助。在编写方法调用时,IntelliSense无法向您提供任何有用的信息,编译器也不能告诉您您遗漏了一个参数或参数类型错误。使用不透明的错误代码(如DISP_E_BADVARTYPE或DISP_E_BADPARAMCOUNT ),您的程序将在运行时失败。而且必须显式地进行Release()调用,这当然会使错过一个调用更容易。当您使用智能指针时,您没有问题,它们会给您自动完成和类型检查。您可以自己看到Solution1.cpp的大小和可读性有多大。
如果诊断错过了对Release()的调用,否则很容易,您的程序就会完成,但是您仍然会看到任务管理器中运行着Outlook.exe。一些你会习惯的检查,它也会发生,当你调试你的程序,找到一个错误,并停止程序作出更正。当然,这也阻止了调用Release(),因此Outlook将继续运行。你得自己杀了它。
请考虑用像C#或VB.NET这样的托管语言编写这类代码。如果遇到问题,您会得到更多的帮助,并且会找到大量的示例代码。垃圾收集器永远不会忘记发出释放电话。这样做有点慢。
https://stackoverflow.com/questions/21447056
复制相似问题