我使用Visual Studio 2015,我有一个C#Application-Project,它定义了一个COM接口并在编译时生成一个.tlb文件。现在我想将Csharp.tlb导入idl。
MyLibrary.idl:
import "oaidl.idl";
import "ocidl.idl";
import "Cplusplus.idl";
library MyLibrary
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
importlib("Csharp.tlb");
interface IMyCOM : IDispatch
{
[propget, id(1)]
HRESULT CpluplusObject
(
[out,retval] ICplusplusObject** cplusplusObject
);
[propget, id(2)]
HRESULT CsharpObject
(
[out, retval] ICsharpObject** csharpObject
);
}
coclass MyCOM
{
[default] interface IMyCOM;
};
}
在编译期间我收到错误
C3646' csharpObject':MyLibrary.tlh中的未知覆盖说明符
MyLibrary.tlh由编译自动生成,如下所示
MyLibrary.tlh:
#pragma once
#pragma pack(push, 8)
#include <comdef.h>
namespace MyLibrary {
struct __declspec(uuid("8e664998-bc93-48e7-adcc-84fc8598cd5d"))
/* dual interface */ ICplusplusObject;
_COM_SMARTPTR_TYPEDEF(ICplusplusObject, __uuidof(ICplusplusObject));
struct __declspec(uuid("388ebf11-05c8-4b86-b2bd-60f0ef38695e"))
IMyLibrary : IDispatch
{
__declspec(property(get=GetCplusplusObject))
ICplusplusObjectPtr cplusplusObject;
__declspec(property(get=GetCsharpObject))
ICsharpObjectPtr csharpObject;
ICplusplusObjectPtr GetCplusplusObject ( );
ICsharpObjectPtr GetCsharpObject ( );
virtual HRESULT __stdcall get_CplusplusObject (
/*[out,retval]*/ struct ICplusplusObject * * cplusplusObject ) = 0;
virtual HRESULT __stdcall get_CsharpObject (
/*[out,retval]*/ struct ICsharpObject * * csharpObject ) = 0;
}
__declspec(implementation_key(1)) ICplusplusObjectPtr IMyLibrary::GetcplusplusObject ( );
__declspec(implementation_key(2)) ICsharpObjectPtr IMyLibrary::GetcsharpObject ( );
}
错误意味着到目前为止我不知道ICsharpObjectPtr或ICsharpObject。 ICplusplusObjectPtr是众所周知的,因为import&#34; ICplusplus.idl&#34;将定义添加到.tlh和importlib中(&#34; ICsharp.tlb&#34;);没有明显的。
出于测试原因,我使用OLE / COM对象查看器从.tlb生成了ICsharp.idl并导入了该idl。之后错误消失了。
但为什么.tlb的importlib无法正常工作?我不想每次都从.tlb生成一个idl文件。
我认为有一个#include&#34; ICsharp.tlh&#34;缺少或使某种类型为.tlh所知的类型。但是如何告诉idl或编译器正确引用ICsharpObject?
非常感谢您的帮助。
答案 0 :(得分:0)
由于tlb-imports命令错误,这是一个错误。 #import指令尝试在编译时生成主(.tlh)和辅助(.tli)头文件。如果tlb使用的是另一个未导入的类型库,则会发生此错误。在这种情况下,以下解决了错误
Importer.cpp
#import "CplusplusLibrary.tlb"
#import "CsharpLibrary.tlb"
#import "MyLibrary.tlb"
非常感谢伊戈尔。