VC++6.0生成.COM DLL中的TLH导致错误

VC++ 6.0 Generated .TLH from COM DLL Results in Errors

本文关键字:错误 TLH 中的 0生成 COM DLL VC++6      更新时间:2023-10-16

问题是,我有一个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;
};

有人知道为什么编译器生成这个文件会给我错误吗?非常感谢您的帮助!

这些字段是C#编译器在使用自动属性时生成的。类似:

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

您应该返回并修复C#代码。还要使用接口,并将类/结构保持为[ClassInterface(ClassInterfaceType.None)],这样就不会公开任何实现。COM方式。如果不能,则可以使用#import指令中的exclude属性跳过疑难解答。类似:

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

重命名属性也可以修复它。