Есть ли способ с помощью MIDL отключить генерацию заголовков в стиле C?

У меня есть простой файл .IDL (iface.idl), который описывает интерфейс на основе IUnknown:

import "unknwn.idl"; 
[
    uuid(80DFDD28-F033-431e-B027-CDD2078FC78A)
]
interface ISunPathCalc : IUnknown {
    HRESULT Square([in, out] long * pVal);
    HRESULT Cube([in, out] long * pVal);
};

При попытке скомпилировать его с midl /header iface.h iface.idl я получаю 3 файла: iface.h, iface_i.c и iface_p.c. Файл iface.h содержит объявление C ++ интерфейса ISunpathCalc:

#if defined(__cplusplus) && !defined(CINTERFACE)

    MIDL_INTERFACE("80DFDD28-F033-431e-B027-CDD2078FC78A")
    ISunPathCalc : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Square( 
            /* [out][in] */ long *pVal) = 0;

        virtual HRESULT STDMETHODCALLTYPE Cube( 
            /* [out][in] */ long *pVal) = 0;

    };

#else   /* C style interface */

Оставшаяся большая часть этого файла содержит ненужный материал C.

В: Есть ли способ указать MIDL генерировать только часть заголовка C ++? Можно ли отключить генерацию файлов iface_i.c и iface_p.c и заставить MIDL вместо этого генерировать определение C ++?

UPD1:

Я попытался добавить атрибут [local], как указано здесь :

[
    local,
    uuid(80DFDD28-F033-431e-B027-CDD2078FC78A)
]

но безуспешно.


person ezpresso    schedule 06.06.2011    source источник
comment
[local] просто сообщает MIDL, что вы не будете использовать интерфейс через границы процессов, поэтому он не учитывает код маршалинга, но по-прежнему использует заголовки. Я не думаю, что есть возможность делать только заголовки C ++. Учитывая, что интерфейсы в стиле C пропускаются препроцессором, почему вам вообще важно, чтобы они были сгенерированы?   -  person BrendanMcK    schedule 07.06.2011
comment
Что ж. Мне нравится чистота в моей комнате, как и в моем коде :) Если серьезно, то после того, как код интерфейса сгенерирован из IDL, я перемещаю его в целевой проект MinGW. Однако некоторые из макросов в части C вызывают сообщения об ошибках.   -  person ezpresso    schedule 07.06.2011
comment
Это очень странно. Очевидно, поскольку вы говорите, что вам не нужна часть C, эта часть C не должна компилироваться, поэтому, если вы получите там ошибки, это означает, что guard #defines не являются процессами, как ожидалось, и я предполагаю, что это реальная проблема, которую вам нужно решить. .   -  person sharptooth    schedule 07.06.2011


Ответы (1)


К сожалению, нет способа подавить генерацию заголовка C.

person ReinstateMonica Larry Osterman    schedule 01.07.2011
comment
Есть обходной путь, midl.exe /header nul /iid nul /proxy nul /dlldata nul file.idl, он сгенерирует только file.tlb. - person acelent; 10.11.2012
comment
Это подавляет ВСЕ генерацию заголовков, вопрос был в том, как подавить генерацию языка C (в отличие от генерации языка C ++) - person ReinstateMonica Larry Osterman; 11.11.2012
comment
Вы правы, я неправильно прочитал вопрос, наверное, по диагонали. - person acelent; 12.11.2012