_ Проблема с генерацией файла привязок PASCAL из файла IDL PSDK

#delphi #idl #typelib #platform-sdk

#delphi #idl #typelib #платформа-sdk

Вопрос:

Я пытался сгенерировать библиотеку типов из одного из файлов IDL, поставляемых PSDK, но пока midl сеанс успешно завершается ( ERRORLEVEL 0), файл tlb не был сгенерирован. В настоящее время я понятия не имею, что не так. Пожалуйста, посоветуйте.

Вот подробная форма вывода midl сеанса:

 >midl emptyvc.idl /tlb .emptyvc.tlb /I "Program FilesMicrosoft SDKsWindowsv7.0Include" /W4
Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeemptyvc.idl
emptyvc.idl
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl
objidl.idl
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeunknwn.idl
unknwn.idl
Processing Program FilesMicrosoft SDKsWindowsv7.0Includewtypes.idl
wtypes.idl
Processing Program FilesMicrosoft SDKsWindowsv7.0Includebasetsd.h
basetsd.h
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeguiddef.h
guiddef.h
Program FilesMicrosoft SDKsWindowsv7.0Includewtypes.idl(671) : warning MIDL2111 : identifier length exceeds 31 characters : STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2308) : warning MIDL2111 : identifier length exceeds 31 characters : FMTID_MediaFileSummaryInformation
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2499) : warning MIDL2111 : identifier length exceeds 31 characters : tagEOLE_AUTHENTICATION_CAPABILITIES
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2518) : warning MIDL2111 : identifier length exceeds 31 characters : EOLE_AUTHENTICATION_CAPABILITIES
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2616) : warning MIDL2111 : identifier length exceeds 31 characters : tagRPCOPT_SERVER_LOCALITY_VALUES
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2652) : warning MIDL2111 : identifier length exceeds 31 characters : COMGLB_EXCEPTION_DONOT_HANDLE_FATAL
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2653) : warning MIDL2111 : identifier length exceeds 31 characters : COMGLB_EXCEPTION_DONOT_HANDLE_FATAL
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2654) : warning MIDL2111 : identifier length exceeds 31 characters : COMGLB_EXCEPTION_DONOT_HANDLE_ANY
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2660) : warning MIDL2111 : identifier length exceeds 31 characters : COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(2661) : warning MIDL2111 : identifier length exceeds 31 characters : COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL
Program FilesMicrosoft SDKsWindowsv7.0Includeobjidl.idl(3359) : warning MIDL2111 : identifier length exceeds 31 characters : APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeoleidl.idl
oleidl.idl
Program FilesMicrosoft SDKsWindowsv7.0Includeoleidl.idl(329) : warning MIDL2111 : identifier length exceeds 31 characters : OLEMISC_RENDERINGISDEVICEINDEPENDENT
Program FilesMicrosoft SDKsWindowsv7.0Includeoleidl.idl(339) : warning MIDL2111 : identifier length exceeds 31 characters : OLEMISC_IGNOREACTIVATEWHENVISIBLE
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeoaidl.idl
oaidl.idl
Processing Program FilesMicrosoft SDKsWindowsv7.0Includeoaidl.acf
oaidl.acf
Program FilesMicrosoft SDKsWindowsv7.0Includeemptyvc.idl(108) : warning MIDL2392 : [local] procedure without [call_as] : [ Procedure 'Initialize'  ]
Program FilesMicrosoft SDKsWindowsv7.0Includeemptyvc.idl(157) : warning MIDL2392 : [local] procedure without [call_as] : [ Procedure 'InitializeEx'  ]
** ERRORLEVEL is 0 at this point **
  

Используемые части и инструменты:

  • без изменений emptyvc.idl из Windows SDK версии 7.0
  • MIDL версия 7.00.0555
  • CL версия 14.00.50727.42

ПРИМЕЧАНИЕ: я считаю, что это не проблема среды, так как первое, что я попытался, это скомпилировать другой файл .idl, и я получил результирующий файл .tbl, как и ожидалось, с в свою очередь был обработан TLIBIMP без каких-либо проблем.


Вот вывод CL (который был полностью отключен MIDL):

 dlldata.c
dlldata.c(24) : error C2061: syntax error : identifier 'PROXYFILE_LIST_START'
dlldata.c(24) : error C2059: syntax error : ';'
dlldata.c(31) : error C2146: syntax error : missing ';' before identifier 'DLLDATA_ROUTINES'
dlldata.c(38) : fatal error C1004: unexpected end-of-file found
  

Комментарии:

1. Где находится Delphi или Pascal часть вашего вопроса? AFAICT, это строго MIDL вопрос. Там нет упоминания о Delphi , кроме как в тегах, и нет упоминания о Pascal , кроме как в названии.

Ответ №1:

MIDL имеет несколько раздражающую привычку не выдавать выходные данные, если нечего выдавать. Вы подтвердили, что в файле emptyvc.idl есть типы, которые могут быть представлены в typelib (классы, интерфейсы, директива библиотеки и т.д.)?

Комментарии:

1. Хм, кто-то удалил тег [delphi], который должен был указывать, что я вроде MSVC n00b. Нет, я не подтверждал, но .idl файл выглядит довольно корректно на мой довольно наивный взгляд. В настоящее время я выяснил, какие промежуточные .c и .h создаются, а затем midl работает на них с полным отключением cl , что, в свою очередь, завершается ошибкой этапа предварительной обработки.

2. Обновлен Q на стороне CL. У вас есть идеи, что может вызвать проблему, файл CL или input .idl (PSDK новее, чем компилятор MS C)?

3. Содержит ли файл .idl библиотечный блок с именем с классами в нем?

4. вы имеете в виду библиотеку, как в расширении Microsoft для IDL? Похоже, такого блока там нет, во всяком случае, вот полный источник IDL: pastebin.com/kxD6YgbF Выглядит корректно, но в результате dlldata.c не удается скомпилировать вывод, который я вставил выше.

5. Мне нужно было бы взглянуть на исходный код, но я не верю, что MIDL выдаст файл tlb без директивы «library» в файле IDL.