Я использую 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?
Заранее большое спасибо за вашу помощь.
Это ошибка из-за неправильного порядка импорта tlb. Директива #import пытается сгенерировать первичные (.tlh) и вторичные (.tli) заголовочные файлы при компиляции. Если tlb использует тип другой библиотеки типов, которая не была импортирована первой, эта ошибка произойдет. В этом случае следующее решило ошибку
Importer.cpp
#import "CplusplusLibrary.tlb"#import "CsharpLibrary.tlb"#import "MyLibrary.tlb"
Огромное спасибо Игорю.
Других решений пока нет …