c++ - GetInterfaceFromGlobal() 调用因 Visual Studio 2010 中的进程外 COM 服务器而失败

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

我有一个使用 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 吗?这会有任何副作用吗?还是我遗漏了什么?

提前致谢 哈里什

最佳答案

不要触及那个常量——忽略这个变化。 _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

关于c++ - GetInterfaceFromGlobal() 调用因 Visual Studio 2010 中的进程外 COM 服务器而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204172/

相关文章:

visual-studio-2010 - 单元测试在 session 窗口中的 "Build failed"上失败,没有消息提供 Visual Studios 2010 中的失败原因

c# - 在 asp.net webservice 中调用 COM DLL 时出错

c++ - 如何以及在注册表中写入什么以在 Windows 启动时自动重启程序

c++ - 通过 CGI 生成 3D GUI

c++ - 具有不同大小位域的数据结构

c++ - lld-link错误编译 Chrome 与ffmpeg附加调用

visual-studio-2010 - 如何更改 Visual Studio 2010 工具提示的背景色或前景色

c# - 如何启动 Windows 窗体应用程序?

c++ - 将我的 DDiscMaster2Events 连接/链接到什么以进行驱动器更改事件。微软 COM 对象

c# - 如何通过 COM 互操作将 VBA 变量数组数据类型传递到 C# 方法中