Ошибка компилятора C3646 «неизвестный спецификатор переопределения» в автоматически сгенерированном .tlh при использовании importlib в idl

Я использую 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 известен, потому что импорт «ICplusplus.idl» добавил определения в .tlh и importlib («ICsharp.tlb»); не очевидно.

По причинам теста я сгенерировал ICsharp.idl из .tlb с помощью OLE / COM Object Viewer и импортировал этот idl. Ошибка исчезла после этого.

Но почему importlib из .tlb не работает напрямую? Я не хочу генерировать файл idl каждый раз из .tlb.

Я думаю, что отсутствует #include «ICsharp.tlh» или что-то такое, что делает тип известным для .tlh. Но как сказать idl или компилятору правильно ссылаться на ICsharpObject?

Заранее большое спасибо за вашу помощь.

0

Решение

Это ошибка из-за неправильного порядка импорта tlb. Директива #import пытается сгенерировать первичные (.tlh) и вторичные (.tli) заголовочные файлы при компиляции. Если tlb использует тип другой библиотеки типов, которая не была импортирована первой, эта ошибка произойдет. В этом случае следующее решило ошибку

Importer.cpp

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

Огромное спасибо Игорю.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]