VC ++ 6.0 сгенерированный .TLH из COM DLL приводит к ошибкам - PullRequest
1 голос
/ 19 марта 2012

Проблема в том, что у меня есть DLL и TLB, которые я создал в C # .NET, сделал его видимым для COM и хотел представить функции моему проекту MFC C ++ - сначала я создал тестовый класс, и он работал правильно, и не получить никаких ошибок из сгенерированного C ++ tlh. Теперь фактическая DLL, которую я хочу использовать, дает мне следующие ошибки компиляции:

error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'

Из следующего сгенерированного C ++ tlh файла:

//
// Type library items
//

struct __declspec(uuid("d6b19eb0-56bf-3c30-9f3a-ebafca303996"))
Class1;
// [ default ] interface _Class1
// interface _Object

struct __declspec(uuid("a7e7ae20-5fb3-3c3f-a9fb-1fac0128dea1"))
IProtracReader : IDispatch
{}

struct TagReadEvent
{
__int64 <Index>k__BackingField;     <<< These three lines are where the errors are.
__int64 <TagID>k__BackingField;
DATE <EventMoment>k__BackingField;
};

Кто-нибудь знает, почему компилятор генерирует этот файл, который дает мне ошибки? Любая помощь приветствуется!

1 Ответ

2 голосов
/ 19 марта 2012

Это поля, которые генерируются компилятором C # при использовании автоматических свойств.Как:

[ComVisible(true)]
public class TagReadEvent {
    public long Index { get; set; }
    // etc...
}

Вы должны вернуться и исправить код C #.Также используйте интерфейсы и сохраняйте классы / структуры как [ClassInterface (ClassInterfaceType.None)], чтобы ни одна из реализаций не была представлена.СОМ способ.Если вы не можете, то можете использовать атрибут exclude в директиве #import, чтобы пропустить нарушителей спокойствия.Например:

#import "something.dll" exclude("TagReadEvent")

Атрибут rename тоже может это исправить.

...