Почему параметр char * изменяется на VARIANT_BOOL * в вызове com? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть решение VS2017, которое было преобразовано из VC6.Он имеет 42 C ++ проекта, которые компилируются без ошибок, с одной необычной аномалией.

Проект A - это проект .exe, имеющий COM-интерфейсы.Интерфейс определен в файле A.odl проекта A.Когда проект A создается, он генерирует ожидаемый файл A.tlb.Файлы .exe и .tlb перемещены в общий каталог Bin.Проект B также является проектом .exe, который использует интерфейс проекта A с директивой #import ".. \ Bin \ A.tlb".

Когда я очищаю решение, удаляю общий каталог Bin и перестраиваю, проект B завершается неудачно со следующим сообщением:

HRESULT A :: IA :: raw_IsSameProject (BSTR, VARIANT_BOOL *);невозможно преобразовать аргумент 2 из 'char *' в 'VARIANT_BOOL *'

Фактический код, который генерирует ошибку:

char chResult = 0;
if (S_OK != pIA->raw_IsProjectLoaded(&chResult)) ...

На этом этапе, если я создаю только проект B, ошибкауходит.

Вот соответствующее содержимое различных файлов перед второй сборкой проекта A. (Файлы A.tlh и A.tli находятся в каталоге Debug проекта B):

A.odl   boolean IsProjectLoaded();
A.tlb   char IsProjectLoaded();
A.tlh   VARIANT_BOOL IsProjectLoaded();
        HRESULT raw_IsProjectLoaded (VARIANT_BOOL * _result = 0);
A.tli   inline VARIANT_BOOL ITndrtData::IsProjectLoaded ( ) {
            VARIANT_BOOL _result = 0;
            _com_dispatch_method(...);
            return _result;
        }
        inline HRESULT ITndrtData::raw_IsProjectLoaded (VARIANT_BOOL* _pr){ 
            return _com_dispatch_raw_method(...);
        }

После создания только проекта B во второй раз:

A.tlh   char IsProjectLoaded();
        HRESULT raw_IsProjectLoaded (char * _result = 0);
A.tli   inline VARIANT_BOOL ITndrtData::IsProjectLoaded ( ) {
            char _result = 0;
            _com_dispatch_method(...);
            return _result;
        }
        inline HRESULT ITndrtData::raw_IsProjectLoaded ( char * _presult ) {
            return _com_dispatch_raw_method(...);
        }

После второй сборки проекта B параметр VARIANT_BOOL изменится на ожидаемый символ.Соответствующий параметр типа в методах _com_dispatch также изменяется с VT_BOOL * на char *.

Проект B имеет ссылку на проект A. Из 42 создаваемых проектов проект A является двенадцатым проектом для построения и проектирования.Б 21-й.

Вопросы:

  • Почему проект B использует параметр VARIANT_BOOL после 1-й сборки
    , но правильный символ после 2-й сборки только проекта B?
  • Почему A.odl указывает логический тип возврата для метода IsProjectLoaded (), но в A.tlb он изменил его на char?
  • Является ли это каким-то артефактом использования и файл odl по сравнению с новым форматом idl?(Я еще недостаточно изучил файлы IDL, чтобы попытаться конвертировать.)

1 Ответ

0 голосов
/ 22 сентября 2018

После публикации вопроса я внимательно изучил результаты сборки и обнаружил проблему.Есть несколько циклических ссылок среди проектов в этом решении.Для этого было создано несколько проектов Circular_Build, которые только создают файл .tlb проекта, используя MIDL для компиляции файла IDL или ODL проекта.ProjeA'ct A имеет проект Circular_Build, который, как я думал, я удалил.Просматривая выходные данные сборки, я заметил, что этот проект Circular_Build все еще строился после того, как были собраны оба проекта A и B.Удаление этого проекта Circular_Build избавило от аномалии.

Это все еще оставляет вопрос о том, почему проект Circular_Build A создает файл .tlb, который использует параметр char *, в то время как нормальная сборка A создает файл .tlb, который использует VARIANT_BOOL* параметр.Сделаю еще какое-нибудь исследование и напишу ответ, если я это выясню.

...