Использование и извлечение из интерфейсов, определенных в другой библиотеке COM - PullRequest
1 голос
/ 16 августа 2010

У меня есть два C ++ COM проекта в Visual Studio. В ProjectA я определяю InterfaceA в MIDL. В ProjectB я хотел бы определить InterfaceB, который наследуется от InterfaceA. Можно ли обойтись без импорта файлов IDL или H из ProjectA?

Вот как выложен код, что может быть понятнее. Библиотеки большие, поэтому я помещаю их в отдельные файлы, чтобы их было проще поддерживать.

Проект A

InterfaceA.idl

import "oaidl.idl";
import "ocidl.idl";

[ uuid( ... ) ]
interface InterfaceA : IDispatch { ... }

CoclassA.idl

import "InterfaceA.idl";

[ uuid( ... ) ]
interface CoclassA
{
    [default] interface InterfaceA;
};

ProjectA.idl

import "InterfaceA.idl";

[ uuid( ... ) ]
library ProjectA
{
    interface InterfaceA;
    #include "CoclassA.idl"
}

Проект B

InterfaceB.idl

import "oaidl.idl";
import "ocidl.idl";

// If both interfaces were in the same project, I'd just import:
//import "InterfaceA.idl";

// Without the import I get a compilation error, obviously. I don't want to
// add ProjectA as an additional include directory because I don't want ProjectB
// to be dependent on how ProjectA's files are organized. I just want the types
// from ProjectA to be available here.

[ uuid(...) ]
interface InterfaceB: InterfaceA { ... }

CoclassB.idl

import "InterfaceB.idl";

[ uuid( ... ) ]
interface CoclassB
{
    [default] interface InterfaceB;
};

ProjectB.idl

import "InterfaceB.idl";

[ uuid( ... ) ]
library ProjectB
{
    // I wish using importlib would help here, but it won't since InterfaceB is
    // defined and compiled by MIDL separately in InterfaceB.idl.
    //importlib("ProjectA.tlb");

    // I could try to #include "InterfaceB.idl", but then I would lose the
    // automatic dependency analysis that MIDL does. I am also having trouble
    // getting the MIDL compiler to understand #defines.

    interface InterfaceB;
    #include "CoclassB.idl"
}

У меня такое ощущение, что то, что я хочу сделать, невозможно. Это не будет проблемой, если MIDL будет поддерживать importlib эквивалент вне библиотек!

...