У меня есть решение 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, чтобы попытаться конвертировать.)