成功完成cocreateinstance后无法访问COM方法

时间:2009-04-24 10:10:32

标签: c++ visual-studio com

成功完成coInitialize和cocreateinstance(COM服务器注册完美)..当我在类中访问一个方法时,它返回错误: “XYZ.exe中的第一次机会异常(OLEAUT32.DLL):0xC0000005:访问冲突”。

通过逐步调试,我发现它在调用

时出现此错误
// make the call
SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags, &dispparams, pvarResult, &excepInfo, &nArgErr);
OLEDIST2.CPP文件中的

请帮助

3 个答案:

答案 0 :(得分:1)

谢谢你的时间。

问题在我的最后解决了。

问题在于将COM服务器的类型库(tlb)导入到我的客户端应用程序中。因此,对象获得了损坏的指针。当调用成员函数时,它会给出ACCESS VOILATION错误。

我实际上使用“CLASS WIZARD”在我的Visual C ++应用程序中导入了类型库,如上所述@ MSDN链接: http://msdn.microsoft.com/en-us/library/aa279228(VS.60).aspx 这实际上导致了上述问题。

后来我通过使用简单的#import“xyz.tlb”导入typelibrary找到了 它生成两个文件.tlh和.tli文件,它们还包含所有类和成员函数定义。 当我在我的项目中使用这些文件时,它可以工作。

很抱歉打扰你......

感谢和问候 sandeep r。

答案 1 :(得分:0)

现在我可以考虑以下检查:

  • 检查一下你是否有机会 调试并查看值 m_lpDispatch。是否值 适当的?(不是NULL)
  • 只是检查是否意外 CoUninitialize()被称为?
  • 检查COM对象是否正确 适当参考计数?

答案 2 :(得分:0)

根据您的代码,唯一立即跳出的是m_lpDispatch可能为NULL或无效指针。该行中的任何其他内容都不会导致访问冲突,因为它实际上不会访问任何内存。

如果你可以确认m_lpDispatch确实是一个有效的变量,那么它可能是Invoke调用的导致问题的方法。如果是这样,那么您可能希望为Visual Studio中的访问冲突启用第一次机会异常处理。

  • 转到:Debug -> Exceptions -> Win32 Exceptions
  • 检查“访问冲突”

然后在调试器下运行您的场景。这将导致visual studio在访问冲突点处中断。这应该使实际问题更加明显。