Как условно выбрать класс C #, который я вызываю через COM, в моей C ++ DLL? - PullRequest
1 голос
/ 09 марта 2009

После большой помощи от всех моих братьев StackOverFlow мне удалось создать C ++ DLL, которая вызывает мои классы C # через COM и передает данные назад и вперед во внешнее приложение. После того, как этот кодекс начал работать, в королевстве было много праздников.

Теперь у меня новая проблема. Я расширяю DLL, чтобы она могла вызывать разные классы (все реализующие один и тот же интерфейс). Мне нужно решить, какой класс вызывать в зависимости от массива char, передаваемого в DLL при загрузке. Методы, которые я вызываю, абсолютно одинаковы, независимо от того, какой класс я использую. Каков наилучший способ переключения между классами при вызове DLL?

 // Initialize COM. 
 HRESULT hr = CoInitialize(NULL);



// I want to do something like this....but how? 
if (strcmp(modelType, "Model1") == 0) { 
        IUnitModelPtr pIUnit(__uuidof(ClassOne));
    }   

    if (strcmp(modelType, "Model2") == 0) { 
        IUnitModelPtr pIUnit(__uuidof(ClassTwo));
    }


//call method 1

//call method 2

CoUninitialize();

//exit

Это, наверное, довольно простой вопрос, но я действительно не знаю никакого C ++. Просто запуск COM стал для меня серьезной проблемой.

edit: Я уверен, что есть некоторые очень изящные способы достичь этого (размышления?), Но, пожалуйста, ограничьте свои предложения вещами, которые можно легко реализовать ... эффективность здесь не важна, а ремонтопригодность на самом деле не проблема.

Ответы [ 2 ]

2 голосов
/ 09 марта 2009

Делай что-то вроде этого:

GUID classId = GUID_NULL;
if( strcmp( modelType, "Model1" ) == 0 ) {
    classId = __uuidof( class1 );
} else if( strcmp( modelType, "Model2" ) == 0 ) {
    classId = __uuidof( class2 );
} else if(... etc, continue for all possible model types
}
IUnitModelPtr unit;
unit.CreateInstance( classId );
// interface methods can be called here
1 голос
/ 09 марта 2009

Два варианта.

Поскольку каждая отдельная реализация интерфейса является коклассом, и ваш код C ++ использует правильный prog-id / classid для выполнения создания.

Альтернативно открытый класс является фабрикой с методом для возврата фактического класса реализации.

Оба нуждаются в логике для сопоставления вашего modelType с классом реализации. Вы можете сделать это в коде C ++ или в коде .NET. Без дополнительной информации об общем контексте (является ли строка -> отображение Coclass логически частью COM-компонента или вызывающей стороны).

(В чистой реализации C ++ COM вы можете создать свою собственную фабрику экземпляров COM, но это более продвинутый COM и недоступен для взаимодействия .NET COM.)

...