代码之家  ›  专栏  ›  技术社区  ›  AndroidDev

GetInterfaceFromGlobal()调用在Visual Studio 2010中失败,进程外的COM服务器

  •  1
  • AndroidDev  · 技术社区  · 14 年前

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

    我使用Git保存指向我的每个COM客户机的IDispatch指针,这样我就可以从进程外的COM服务器向他们发送事件。调试后,我发现的原因是m_vec.getSize()返回的连接数是4而不是1。即使我只添加一个客户机,其值也将为4。我检查了atlcom.h,在这个文件中,在最新版本中,默认的vectorlength从1改为4。

    #ifndef _DEFAULT_VECTORLENGTH
    #define _DEFAULT_VECTORLENGTH 4
    #endif
    

    关于如何覆盖这个值有什么建议吗?我可以在代码中简单地将其重新定义为1吗?这会有副作用吗?或者我错过了什么?

    提前谢谢 哈里什

    1 回复  |  直到 14 年前
        1
  •  1
  •   sharptooth    14 年前

    不要碰那个常数-忽略这个变化。 _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