Tlbimport(从C#库生成的tlb)
我们创建了一个简单的C#类库,如下所示(ClassLibrary1): 从中导出tlb并使用: importlib(“ClassLibrary1.tlb”);在idl文件中 问题是intarface类型(IMyTestInterface)可以在idl中使用,但是结构是不可访问的,我们不知道为什么 因此,可以编译此idl:Tlbimport(从C#库生成的tlb),c#,c++,tlb,midl,comvisible,C#,C++,Tlb,Midl,Comvisible,我们创建了一个简单的C#类库,如下所示(ClassLibrary1): 从中导出tlb并使用: importlib(“ClassLibrary1.tlb”);在idl文件中 问题是intarface类型(IMyTestInterface)可以在idl中使用,但是结构是不可访问的,我们不知道为什么 因此,可以编译此idl: importlib("stdole2.tlb"); importlib("ClassLibrary1.tlb"); [ object, uuid(DB25FC
importlib("stdole2.tlb");
importlib("ClassLibrary1.tlb");
[
object,
uuid(DB25FC11-C288-4B31-BE11-5BBA6B273D9B),
dual,
nonextensible,
pointer_default(unique)
]
interface IMyNativeTestObj : IDispatch
{
[id(1)] HRESULT MyFunction([in] IMyTestInterface *Parameter);
};
这不是:
importlib(“stdole2.tlb”);
importlib(“ClassLibrary1.tlb”)
我们尝试了tagMyTestStruct,得到了相同的结果。如果我们打开包含OleView“MyTestStruct”的tlb。
struct
s是一个互操作问题。如果您想使用该工具自动生成TLB和头文件,请使用接口。C语言处理结构标记的愚蠢方式也适用于IDL。您必须使用struct MyTestStruct*
。使用结构时一定要小心,您必须正式使用IRecordInfo来访问成员。您将获得两个简单的int
成员,因为几乎每种语言都为该结构选择相同的布局,如果字段类型更复杂,则情况可能并非如此。破坏GC堆不是一件乐事。好吧,从技术上讲,这是不可能的,也不建议这样做。然后我们将声明移到C++侧,然后将结构转换为接口。谢谢。struct
s是一个互操作问题。如果您想使用该工具自动生成TLB和头文件,请使用接口。C语言处理结构标记的愚蠢方式也适用于IDL。您必须使用struct MyTestStruct*
。使用结构时一定要小心,您必须正式使用IRecordInfo来访问成员。您将获得两个简单的int
成员,因为几乎每种语言都为该结构选择相同的布局,如果字段类型更复杂,则情况可能并非如此。破坏GC堆不是一件乐事。好吧,从技术上讲,这是不可能的,也不建议这样做。然后我们将声明移到C++侧,然后将结构转换为接口。谢谢
importlib("stdole2.tlb");
importlib("ClassLibrary1.tlb");
[
object,
uuid(DB25FC11-C288-4B31-BE11-5BBA6B273D9B),
dual,
nonextensible,
pointer_default(unique)
]
interface IMyNativeTestObj : IDispatch
{
[id(1)] HRESULT MyFunction([in] IMyTestInterface *Parameter);
};
[
object,
uuid(DB25FC11-C288-4B31-BE11-5BBA6B273D9B),
dual,
nonextensible,
pointer_default(unique)
]
interface IMyNativeTestObj : IDispatch
{
[id(1)] HRESULT MyFunction([in] MyTestStruct *Parameter);
};