【问题标题】:GetInterfaceFromGlobal() call fails with an out-of-process COM server in Visual Studio 2010GetInterfaceFromGlobal() 调用因 Visual Studio 2010 中的进程外 COM 服务器而失败
【发布时间】:2011-05-11 09:21:25
【问题描述】:

我有一个使用 Visual Studio 6.0 开发的进程外 COM 服务器可执行文件,它在过去 10 年中一直运行良好。现在我将此项目转换为 Visual Studio 2010 并遇到了 GetInterfaceFromGlobal() 的问题。

我正在使用 GIT 来保存指向我的每个 COM 客户端的 IDispatch 指针,以便我可以从进程外 COM 服务器向它们发送事件。经过调试,我发现的原因是没有。 m_vec.Getsize() 返回的连接数为 4 而不是 1。即使我只添加一个客户端,该值也为 4。我检查了 ATLCOM.h 并在该文件中的 _DEFAULT_VECTORLENGTH 从 1 更改为 4最新版本。

#ifndef _DEFAULT_VECTORLENGTH
#define _DEFAULT_VECTORLENGTH 4
#endif

关于如何覆盖此值的任何建议?我应该在我的代码中简单地将其重新定义为 1 吗?这会有什么副作用吗?还是我错过了什么?

提前致谢 哈里什

【问题讨论】:

    标签: c++ visual-studio-2010 com atl


    【解决方案1】:

    不要碰那个常数——忽略变化。 _DEFAULT_VECTORLENGTH 控制 CComDynamicUnkArray::Add() 的工作方式,您的代码遍历 CComDynamicUnkArray 对象应该跳过存储在其中的空指针。

    类似这样的:

    for( int i = 0; i < array.GetSize(); i++ ) {
      IUnknown* pointer = array.GetAt( i );
      if( pointer == 0 ) {
          continue;
      }
      //proceed with the pointer
    }
    

    如果您决定更改该常量,请确保静态链接到 ATL,并确保您在 ATL 中也更改该常量并重建 ATL。否则,您可能会因为 described here

    的原因而遇到未定义的行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 2011-06-03
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多