gpt4 book ai didi

c++ - 在 idl 中使用 importlib 时,自动生成的 .tlh 中的编译器错误 C3646 'unknown override specifier'

转载 作者:行者123 更新时间:2023-12-02 10:25:17 27 4
gpt4 key购买 nike

我使用 Visual Studio 2015,我有一个 C# 应用程序项目,它定义了一个 COM 接口(interface)并在编译时生成一个 .tlb 文件。现在我想将该 Csharp.tlb 导入 idl。

我的图书馆.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 "ICplusplus.idl"将定义添加到 .tlh 和 importlib("ICsharp.tlb");没有明显。

出于测试原因,我使用 OLE/COM 对象查看器从 .tlb 生成了 ICsharp.idl,并导入了该 idl。之后错误就消失了。

但是为什么 .tlb 的 importlib 不能直接工作呢?我不想每次都从 .tlb 中生成一个 idl 文件。

我认为缺少#include“ICsharp.tlh”或使该类型以.tlh而闻名。但是如何告诉 idl 或编译器正确引用 ICsharpObject 呢?

非常感谢您的帮助。

最佳答案

这是由于 tlb-imports 的错误顺序导致的错误。 #import 指令尝试在编译时生成主 (.tlh) 和辅助 (.tli) 头文件。如果 tlb 使用了另一个类型库的类型,而该类型不是首先导入的,则会发生此错误。在这种情况下,以下解决了错误

进口商.cpp

#import "CplusplusLibrary.tlb"
#import "CsharpLibrary.tlb"
#import "MyLibrary.tlb"

非常感谢伊戈尔。

关于c++ - 在 idl 中使用 importlib 时,自动生成的 .tlh 中的编译器错误 C3646 'unknown override specifier',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com