У нас есть библиотека c ++, и мы автоматически генерируем интерфейс COM для этой библиотеки. поэтому я автоматически сгенерировал файл IDL, и все работало нормально. Но со временем, когда в COM было добавлено больше интерфейса, мы начали получать ошибку
1> Total Format String size = 69336
1> midl : error MIDL2379: the compiler reached a limit for a format string representation. See documentation for advice.
Я получаю эту ошибку в VS2008 и VS2010.
Может кто-нибудь, пожалуйста, помогите мне, как решить эту проблему. Я искал по всему интернету и не мог найти правильное решение. Об одной ошибке сообщается в Microsoft Connect, но его статус закрыт. Один из обходных путей, которые они предлагают, — это разделение файла IDL, что в моем случае невозможно, поскольку интерфейсы зависят друг от друга.
Я загрузил образец файла IDL SampleGenerated.idl
вот командная строка в мидл.
/W1 /nologo /char signed /env win32 /h "SampleGenerated_h.h" /tlb "Debug\SampleGenerated.tlb"
Вот как мне удалось сделать это наконец …
Сначала разделите каждый интерфейс на отдельный файл IDL
Interface1.idl
Interface Interface2; // forward declaration
#ifndef __Interface1_IDL_FILE_
#define __Interface1_IDL_FILE_
import "AllIDLInterface.idl";
[
object,
uuid(66006A2F-B777-4e2f-A0CA-D5BE00000015),
dual,
nonextensible,
pointer_default(unique)
]
interface Interface1 : IUnknown{
HRESULT getInterface2([out, retval]Interface2** outVal )
};
#endif
Interface2.idl
Interface Interface1;// forward delcarations
#ifndef __Interface2_IDL_FILE_
#define __Interface2_IDL_FILE_
import "AllIDLInterface.idl";
[
object,
uuid(66006A2F-B777-4e2f-A0CA-D5BE00000015),
dual,
nonextensible,
pointer_default(unique)
]
interface Interface2 : IUnknown
{
HRESULT getInterface1([out, retval]Interface1** outVal )
};
#endif
Создать другой файл IDL AllInterface.idl содержащий импорт всего файла интерфейса
import Interface1.idl
import Interface2.idl
Теперь main.idl для которого мы будем создавать файлы TLB
import AllInterface.idl;
Единственным недостатком здесь является то, что мы должны скомпилировать каждый файл IDL отдельно, если мы хотим сгенерировать заголовочный файл C ++ / C интерфейсов.
Других решений пока нет …