Значение CoInitialize
- ввести вашу нить в квартиру; и CoUninitialize
удаляет вашу ветку из квартиры.
Использование указателя интерфейса, когда вы не находитесь в квартире, вызывает проблему, потому что вам разрешено использовать необработанный указатель интерфейса только в той квартире, в которой он был создан. (Вы можете использовать указатель интерфейса для другой квартиры, чтобы использовать это в другой квартире).
Когда вы делаете вызов через указатель интерфейса, и объект находится в другой квартире (что в данном случае верно), указатель вашего интерфейса делает вызовы в прокси-объект в квартире, который затем связывается через RPC с заглушкой в квартира назначения. Если вы покинули квартиру (выполнив CoUninitialize
), этот транспорт больше не будет доступен, что приведет к вашей ошибке.
Если вы время от времени используете внутрипроцессные серверы, вы можете сойти с CoUninitialize перед вызовом Release, потому что не задействован транспортный уровень, но это не очень хорошая идея.
Кстати, второй аргумент CoInitialize
указывает, хотите ли вы ввести STA (т. Е. Ваша нить будет единственной нитью в вашей квартире; при этом будет создана новая квартира), или MTA (из который есть один на процесс).
Возможны варианты COINIT_APARTMENTTHREADED
и COINIT_MULTITHREADED
соответственно; Вы указали 0
, что на самом деле COINIT_MULTITHREADED
. ИМХО, было бы яснее использовать символическое имя в вашем коде, а не магическое число.