我有一个使用 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/