Как вызвать .Net COM + объект из библиотеки функций C ++? - PullRequest
2 голосов
/ 30 марта 2011

Я не нашел пример, который действительно работает.Мне нужно создать систему взаимодействия для MetaTrader.Лучше использовать современные технологии, такие как WCF или что-то еще, используя C #, но MetaTrader вообще не поддерживает COM или просто ООП.Поэтому мне нужен некоторый компонент шлюза, который должен быть библиотекой функций с необъектным интерфейсом.Конечно, это требует использования C ++.Но мне не удалось найти в Интернете пример того, как из библиотеки функций C ++ вызвать библиотеку C # COM +.Все примеры, которые я смог найти, используют сборки компонентов C ++, которые не поддерживаются MetaTrader.Поэтому я не могу использовать пространство имен и т. Д. В C ++.Я написал серверное приложение COM +, которое легко вызывать из C # по следующим строкам

object c2 = Activator.CreateInstance(Type.GetTypeFromProgID("Imutome.COMPlusCache.Cache"));
c2.GetType().InvokeMember("OnTransfer", BindingFlags.InvokeMethod, null, c2, null);

Но когда я пытаюсь написать в C ++ что-то вроде этого

CLSIDFromProgID(OLESTR("Imutome.COMPlusCache.Cache"), &rclsid);
HRESULT hres = CoCreateInstance(rclsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&ppv);

, я получаюпросто нули в ppv и "0x80040154 класс не зарегистрирован" в hres.Я не уверен, какие флаги или какой интерфейс требуются, но я получаю ту же ошибку, что бы я ни пытался.Хотя в C # все работает.Скажите, пожалуйста, что мне нужно изменить, чтобы C ++ успешно создал экземпляр объекта COM +.

1 Ответ

1 голос
/ 31 марта 2011

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

regasm your_component_name.dll / tlb / Кодовая

OR

regasm your_component_name.dll / tlb

И поместите вашу библиотеку компонентов в GAC или в ваше исполняемое местоположение. Надеюсь это поможет. GUI компонента не совпадает.

...