Как загрузить COM DLL во время выполнения - PullRequest
1 голос
/ 04 июня 2010

У меня есть VB6 COM DLL. Я хочу использовать его из C ++. Я знаю, как его зарегистрировать, сгенерировать файл tlb из библиотеки DLL и импортировать его в C ++.

Однако я бы хотел загружать и использовать такие библиотеки DLL динамически, во время выполнения, не зная их заранее. Это возможно?

Спасибо

Ответы [ 3 ]

4 голосов
/ 04 июня 2010

Да, но вам нужно прояснить вопрос.

Иногда вы заранее знаете интерфейс COM, но не реализацию. В этом случае вы можете создать фиктивную реализацию интерфейса и #import. Во время выполнения вы все равно зарегистрируете реальный компонент, получите от него объект (возможно, через CoCreateInstance) и сохраните его в соответствующем интеллектуальном указателе.

С VB6 это немного менее прямолинейно. Это добавляет уровень косвенности. Читайте на IDispatch. Вам нужно получить этот известный интерфейс для описания неизвестного интерфейса. Таким образом, неизвестный интерфейс может быть получен во время выполнения.

2 голосов
/ 04 июня 2010

ИМХО, вам нужен хотя бы какой-то общий интерфейс (чтобы вы знали, что вызывать на стороне C ++).

Я бы сделал что-то вроде:

  1. Определить общий интерфейс (в своей собственной DLL / TLB)

  2. Реализация этого интерфейса на одном или нескольких COM-серверах

  3. Импорт этого интерфейса на стороне C ++ (назовем его client )

  4. Определите способ передачи progid COM-сервера, с которым вы хотите работать (динамически загружать) в клиенте.

Надеюсь, это поможет

1 голос
/ 04 июня 2010

Взгляните на эти две статьи MSDN здесь и здесь о Активация COM-компонентов без регистрации . Там также был такой же вопрос здесь, на SO:

...