Вызов GetInterfaceFromGlobal () завершается неудачно с COM-сервером вне процесса в Visual Studio 2010 - PullRequest
1 голос
/ 17 ноября 2010

У меня есть исполняемый файл COM-сервера вне процесса, который был разработан с использованием Visual Studio 6.0 и работает нормально в течение последних 10 лет. Теперь я преобразовал этот проект в Visual Studio 2010 и столкнулся с проблемой с GetInterfaceFromGlobal ().

Я использую GIT для хранения указателей IDispatch для каждого из моих COM-клиентов, чтобы я мог отправлять им события с COM-сервера вне процесса. После отладки я узнал, что нет. количество соединений, возвращаемых функцией m_vec.Getsize (), равно 4 вместо 1. Даже если я добавлю только одного клиента, значение будет равно 4. Я проверил ATLCOM.h, и в этом файле _DEFAULT_VECTORLENGTH изменяется с 1 на 4 в последние версии.

#ifndef _DEFAULT_VECTORLENGTH
#define _DEFAULT_VECTORLENGTH 4
#endif

Какой-нибудь совет, как я могу переопределить это значение? Должен ли я просто переопределить это к 1 в моем коде? Будет ли это иметь какие-либо побочные эффекты? или я что-то упустил?

Спасибо заранее Хариш

1 Ответ

1 голос
/ 17 ноября 2010

Не трогайте эту константу - просто игнорируйте изменения. _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. В противном случае вы рискуете столкнуться с неопределенным поведением по причинам , описанным здесь

...