Я использую Visual Studio 2015, и у меня есть проект приложения C #, который определяет 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 «ICplusplus.idl» добавил определения в .tlh и importlib («ICsharp.tlb»); не сделал очевидно.
По причинам тестирования я сгенерировал ICsharp.idl из .tlb с помощью OLE / COM Object Viewer и импортировал этот idl. После этого ошибка исчезла.
Но почему importlib для .tlb не работает напрямую? Я не хочу каждый раз генерировать файл idl из .tlb.
Я думаю, что отсутствует #include "ICsharp.tlh" или что-то еще, чтобы сделать этот тип известным для .tlh. Но как указать idl или компилятору правильно ссылаться на ICsharpObject?
Заранее большое спасибо за вашу помощь.
library
. В этом нет никакого смысла. Естественно, что методы должны быть частью интерфейса. - person Igor Tandetnik   schedule 12.08.2016auto_search
со своей директивой#import
. Или сначала явно#import
Csharp.tlb. - person Igor Tandetnik   schedule 12.08.2016#import
в вашем коде C ++. Вы хотите сказать, что у вас нет такого заявления? При всем уважении, мне трудно поверить. - person Igor Tandetnik   schedule 12.08.2016