Вызов функции в управляемой DLL из собственного кода Visual C ++ через COM - PullRequest
0 голосов
/ 11 июля 2011

Заранее извиняюсь за следующий подробный вопрос;Я новичок COM.

Сценарий: Мне нужно вызвать управляемую DLL, созданную на C #, из собственного кода Visual C ++ .В своем родном коде VC ++ я делаю следующее после регистрации файла SomeDLL.dll и создания файла SomeDLL.tlb с помощью RegAsm.exe.

  • Импорт файла TLB с помощью #import "SomeDLL.tlb"
  • Используйте класс MyClass, определенный в DLL с CComPtr<MyClass>.

Все отлично!Он компилируется, и я могу запустить код и т. Д. Он попадает в вентилятор, когда я пытаюсь запустить это приложение на другом компьютере (т.е. не на том, на котором я его скомпилировал).Я копирую все необходимые библиотеки DLL и регистрирую ту же библиотеку DLL с RegAsm.exe, но она не работает.

В частности, происходит сбой при попытке инициализировать библиотеку COM с помощью CoInitialize(0) и возвращается ошибка S_FALSE, что означает

Библиотека COM уже инициализирована в этом потоке.

Я могу с уверенностью заявить, что я нигде не вызывал эту функцию в своем коде.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Трудно помочь вам найти этот код отсюда, вы намного ближе.Может быть, DLL, которая вводится.

Получение S_FALSE - это , а не ошибка, получение RPC_E_CHANGED_MODE было бы очень плохо.Обязательно используйте макрос FAILED:

HRESULT hr = CoInitialize(0);
if (FAILED(hr)) {
    CallNineOneOne(hr);
    exit(hr);
}
0 голосов
/ 11 июля 2011

Возможно, вы вызвали OleInitialize или другую функцию, которая вызывает ComInitialize за кулисами.

В любом случае, не имеет значения вызывать CoInitialize несколько раз для потока, если вы сопоставляете каждый из них с вызовом CoUninitialize

...