2012-02-08 3 views
1

Сегодня я должен был определить макрос препроцессора WIN32_MEAN_AND_LEAN в собственном проекте C++, потому что я решил использовать в нем boost::asio, и без этого макроса я получаю ошибки сборки.Безопасно ли удалить вызов OleInitialize из статической библиотеки COM?

Вещь, ошибка, которую я получаю сейчас, это OleInitialize: identifier not found. Согласно MSDN, эта функция используется для инициализации библиотеки COM. Мой проект теперь не является библиотекой COM, но мои партнеры говорят, что это было раньше.

В этом случае было бы безопасно удалить звонок? В проекте используется сочетание функций последовательного порта Win32 и boost :: asio (постепенно я оставляю только boost :: asio). Меня беспокоит то, что OleInitialize может потребоваться для некоторых вызовов Win32.

Это все это делается с ним:

HRESULT hOle = OleInitialize(0); 
if(!SUCCEEDED(hOle)) 
    throw "Could not initialize OLE"; 
+0

Простейшим решением является копирование/вставка прототипов из MSDN в ваш собственный заголовок и продолжение функций. –

ответ

2

Самое худшее, что будет происходить в методы COM могут начать неудачу, если вы по-прежнему называя некоторые из них. OleInitialize() звонки CoInitialize() внутренне. Только эти функции нуждаются в этом. Базовые функции Win32 (CreateWindow, CreateFile и т. Д.) Не требуют этой инициализации.

Если вы не вызываете какие-либо методы COM (любая из функций CoXXX()), и вы не вызываете никаких методов Ole (OleXXX()), тогда вы должны быть в порядке, если вы его удалите.

Вы должны выполнить быстрый поиск своей базы кода для функций COM/OLE и убедиться, что вы больше не используете эти технологии. Затем вы можете создать сборку, где вы этого не сделаете, и проверить ее, чтобы увидеть, работает ли она (у вас есть набор тестовых примеров, верно?).

Посмотрите на Docs на другие предметы, которые могут сломаться, что вы должны проверить.

+0

+1: Кажется, этот звонок был последним, и как-то проскользнул через наш рефакторинг looooong, чтобы переместиться с COM на C++/CLI, в прошлом году. У нас есть некоторые автоматизированные единицы измерения и интеграционные тесты, но охват по-прежнему низкий. На этот раз я это сделаю. –

+0

Что делает 'OleInitialize()' в дополнение к вызову 'CoInitialize()'? Я взял унаследованный код, который был у обоих, удалил вызов 'OleInitialize()', и все продолжало работать очень хорошо - по достоинству оценит ваше понимание; Благодарю. – Sabuncu