Интеграция приложений C # и C ++ с использованием защищенного COM через C ++ .TLB, на который есть ссылки - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь заставить мое приложение C # 4.0 (VS2010) взаимодействовать с приложением C ++, используя COM и библиотеку ссылочных типов.

Все примеры, которые я видел, в основном использовали сторонние библиотекивключить элементы управления ActiveX или DLL, где вы можете просто добавить ссылку и создавать объекты.Я не могу создать какие-либо объекты напрямую (я получаю сообщение об ошибке об использовании интерфейса) и не могу найти ничего, что вернет интерфейс.

Это защищенная COM-библиотека для доступа к зашифрованной базе данных, для создания которой требуется пароль-пароль.

Я потратил много времени на это, чтобы в целом узнать, что нужно сделать.но также достаточно, чтобы понять, что это настолько неясно, что я не собираюсь выяснять это в разумные сроки.Самые близкие примеры, которые я нашел, являются очень абстрактными и недокументированными.Это может быть полезно для кого-то, кто понимает COM и рефлексию и очень хорошо взаимодействует, но его недостаточно для использования в качестве отправной точки моего опыта.Я чувствую месяцы, когда я не могу его назвать.


Приложение C ++ было построено в режиме выпуска с использованием VS2005, и .tlb был успешно добавлен в качестве ссылки на мое решение C # 2010.Приложение C ++ установлено на моей машине для разработки.

В браузере объектов я вижу открытый класс SecureRepositoryClass, член SecurityAgentLib, с методом GetPolicyValue (string, string, string), который я хочу вызвать.Это реализует ISecureRepository, который определил GetPolicyValue.

Я знаю, что что-то должно вернуть ссылку, которую я могу привести к ISecureRepository, а затем вызвать нужный мне метод.

Что я не могу понять, как это сделать, так это получить ссылку наэтот.Наш проект C ++ (написанный кем-то другим, к сожалению, я не являюсь разработчиком C ++) использует следующий код (с переменными, которые установлены в другом контексте)

   HRESULT hr = CoGetClassObject(CLSID_SecureRuntimeAgent, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory2, (void**) &pClf);

   if ((SUCCEEDED(hr)))
   {
         CComBSTR bstrKey = (LPCTSTR)ProduceKey();
         hr = pClf->CreateInstanceLic(NULL, NULL, IID_ISecureRuntimeAgent, bstrKey, (void**)&m_pIAPLI);
         if ((!SUCCEEDED(hr)))

Я искал CreateInstanceLic, CoGetClassObject,и пытался найти эквиваленты C #.

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

Я знаю, что у меняи что мне нужно, но не как туда добраться.

1 Ответ

1 голос
/ 03 ноября 2011

Не похоже, что COM-интерфейс IClassFactory2 реализован в стандартной вызываемой оболочке во время выполнения, поэтому похоже, что вам придется сделать это методом грубой силы и вызвать неуправляемый API в Ole32.dll из вашего управляемого код. Вот пример того, как это делается в C # http://www.dotnet247.com/247reference/msgs/28/144657.aspx. Я не решаюсь скопировать этот код прямо здесь, поскольку для этого кода не указаны условия авторского права.

...