Что делать, если MIDL не может создать TLB?

Я пытаюсь создать inproc-сервер C # для sbtsv.idl (он включен в Windows 8 SDK). Почти все инструкции, которые я нахожу, говорят вам использовать MIDL для создания .tlb файл, затем tlbimport, чтобы создать прокси dll.

Однако, если IDL не включает library раздел .tlb файл не будет создан, а sbtsv.idl не включает library раздел.

Я попытался создать свой собственный файл IDL, в котором объявлен интерфейс, который я хотел создать внутри библиотеки.

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\sbtsv.idl"

[uuid(43250D0C-BBC6-4109-BCD2-6F61F0D3B611)]
library sbtsvClientLib
{
    interface ITsSbResourceNotification;
};

Однако, когда я пытаюсь запустить его через MIDL, я получаю следующую ошибку

Microsoft (R) 32b/64b MIDL Compiler Version 8.00.0603  
Copyright (c) Microsoft Corporation. All rights reserved.  
Processing .\sbtsvClientLib.idl  
sbtsvClientLib.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl  
oaidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl  
objidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl  
unknwn.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypes.idl  
wtypes.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypesbase.idl  
wtypesbase.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\basetsd.h  
basetsd.h  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\guiddef.h  
guiddef.h  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\SessdirPublicTypes.idl  
SessdirPublicTypes.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.acf  
oaidl.acf  
midl\oleaut32.dll : error MIDL2020 : error generating type library : SetFuncAndParamNames failed : put_State (0x8002802C)

Я думаю, мне придется писать классы и интерфейсы вручную, но я хотел проверить, делаю ли я что-нибудь не так, что позволило бы этому сработать.


person Scott Chamberlain    schedule 31.10.2013    source источник


Ответы (1)


Есть два вида COM. Первоначальный вид, появившийся в начале девяностых годов, был нацелен на взаимодействие с C или C ++ и был создан группой Office в Microsoft. И более поздний вид, подмножество COM, первоначально называвшееся OLE Automation. Разработан командой Visual Basic в группе DevDiv, когда они искали альтернативу VBX, 16-разрядной модели расширения для ранних версий Visual Basic. Позже было переименовано в ActiveX как маркетинговый термин. Получив широкую известность из-за своей небезопасности, он снова был переименован в обычный COM.

Автоматизация оказалась невероятно успешной за пределами использования VB, любая языковая среда в Windows поддерживает ее. Существенно помогло то, что он реализовал строгое подмножество COM, которое было легко реализовать. А для поддержки библиотек типов - независимый от языка способ сообщить компилятору об объявлениях.

Это не вытеснило «старый» COM, который все еще очень активно используется в Windows. Многие apis выдержаны в "старом" стиле. Стандартный сигнал летучей мыши для неавтоматического типа - это "cppquote" в файле IDL. Или интерфейсы, производные от IUnknown вместо IDispatch. Или методы, использующие необработанные массивы вместо SAFEARRAY. Или типы структур, которые поступают из заголовка Windows SDK, который может прочитать только компилятор C или C ++.

Все, что вы видите в sbtsv.idl.

MIDL ничего не знает об ограничениях автоматизации, он просто компилирует IDL и бессмысленно вызывает методы интерфейса ICreateTypeInfo в oleauto32. Что может легко возразить, если формат библиотеки типов его не поддерживает. Сообщение об ошибке - отстой, оно не говорит вам точно, в каком объявлении произошла ошибка. Это обычное дело для MIDL или инструментов Windows SDK в целом, диагностика не является их сильной стороной. DevDiv создает удобные инструменты.

В противном случае не нужно много гадать, какая декларация виновата в sbtsv.idl. О них всех. Вам действительно придется проделать это сложным путем, написав декларации [ComImport] самостоятельно. Это болезненно и подвержено ошибкам, лучше подумайте о оболочке C ++ / CLI.

person Hans Passant    schedule 01.11.2013
comment
Есть ли у вас какие-либо предложения по использованию ускоренного курса по написанию оболочки C ++ / CLI? - person Scott Chamberlain; 06.11.2013
comment
Я не могу придумать ни одной, которая бы не приводила к сбоям. Воспользуйтесь всемогущим учебником Google, c ++ / cli. - person Hans Passant; 06.11.2013
comment
К сожалению, флажок Включить только хорошо написанные и не запутанные руководства еще не реализован в Google. Я нашла несколько, просто надеялась на какие-нибудь бриллианты в ершике, о которых вы знали :) - person Scott Chamberlain; 06.11.2013