Мы пытаемся добавить модульное тестирование в наше устаревшее COM-приложение на C ++. Нам также нужны наши сборочные машины, чтобы иметь возможность выполнять юнит-тесты, чтобы гарантировать, что в каждой сборке не было ошибок. Однако мы не хотим, чтобы сборочные машины регистрировали пакеты, чтобы одна сборочная машина могла создавать несколько версий параллельно.
Мы предполагали, что сможем перейти на использование бесплатного регистрационного com с файлами манифеста, но мне очень трудно заставить это работать. Пока не на нашей базе кода, а только на базовом примере, предоставленном Microsoft.
Я использую эту страницу http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8
и это просто не будет работать, когда я пытаюсь запустить с незарегистрированной DLL, чтобы использовать файлы манифеста, я получаю «Класс не зарегистрировано ошибка»
Образцы, которые они предоставляют, работают нормально (используя c ++ com-сервер и c ++ клиент), однако, когда я перестраиваю их, они не работают.
Мы используем Visual Studio 2013 и, как мне кажется, произошли большие изменения в том, как работает бесплатная регистрация, что делает этот учебник несовместимым с новым компилятором.
Может кто-нибудь указать мне на ресурсы по использованию бесплатной регистрации com с последней версией visual studio? Чтобы еще больше усложнить ситуацию в нашем собственном приложении, когда я туда доберусь, мы используем VS 2013, но ориентируемся на компилятор 2010 года, надеюсь, это не будет иметь большого значения.
Также, если есть лучший способ запуска модульных тестов c ++ на com-компонентах без регистрации, чем файлы манифеста, я также хотел бы услышать о них.
Спасибо за вашу помощь.
Возможно, слишком поздно для ОП, но для всех, кто сталкивается с этим вопросом, есть статья Сэмюэля Джека по этому вопросу здесь … которая может или не может помочь будущим читателям …
Увидеть http://blog.functionalfun.net/2012/09/a-quick-guide-to-registration-free-com.html
Вы можете реализовать свою собственную версию CoCreateInstance, которая принимает дополнительный параметр пути DLL. Код будет примерно таким (обработка ошибок и другие подробности для краткости опущены):
HRESULT CoCreateInstanceForTest(dllPath, rclsid, riid, ppv)
{
HINSTANCE hinst = LoadLibrary(dllPath); // TODO: Maybe it is already loaded
dllGetClassObject = GetProcAddress(hinst, "DllGetClassObject");
return dllGetClassObject(rclsid, riid, ppv);
}
Помимо обработки ошибок, вам также необходимо отслеживать библиотеки DLL, которые вы уже загрузили. Используйте список или массив, в котором каждый элемент имеет кортеж для отслеживания этого. В какой-то момент вы можете разгрузить все или некоторые из них.
Конечно, я предполагаю, что это inproc COM-серверы.