Ошибка создания ISoreNamespace (outlook) в Vista x86
От: kinetix  
Дата: 01.10.10 08:41
Оценка:
Мое приложение подключается к серверу оутлука для того что бы вычитать оттуда почту.
Приложение довольно сложное с кучей оберток, поэтому приведу пример кода аналогичного теста, в котором наблюдается похожая проблемма.

    HRESULT hr = CoInitialize(0);
    if(FAILED(hr)) {
        MessageBox(_T("Error CoInitialize."), _T("Demo Error"));
        EndDialog(1);
        return FALSE;
    }

  hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, 
    NULL, EOAC_NONE, NULL);                      //  Reserved parameter
    hr = CoCreateInstance(CLSID_StoreNamespace, NULL, CLSCTX_SERVER, 
                                    IID_IStoreNamespace, (LPVOID*) &m_pStoreNamespace);
    if(FAILED(hr)) {
        MessageBox(_T("Error creating IStoreNamespace."), _T("Demo Error"));
        EndDialog(1);
        return FALSE;
    }


Проблемма в CoCreateInstance, вызов которого возвращает hr = 0x80080005 Ошибка при выполнении приложения-сервера.
Наблюдается при только при соблюдении следующих условий:
1. Vista x86 (на 64 все ок)
2. Должен быть запущен ком сервер (пользователь заранее стартанул winmail.exe).
3. Интегрити левел сервера и клиента отличны (пользователь может стартовать winmail.exe как угодно, com клиент — всегда с повышенными привелегиями)

Поинвестигейтив проблеммку пришел к след выводам:
На других системах (например виста 64) ком сервер стартует inproc. В моем случае ком сервер как inproc по непонятным причинам не стартует. Пытается стартовать как LOCAL_SERVER. Видит что интегрити разные, стартует еще один екземпляр winmail.exe. winmail.exe сделан как синглтон, поэтому запуск второго эекземпляра фейлится, CoCreateInstance тоже фейлится.

Проблемму, как я понимаю можно решить несколькими способами на разных этапах:
1. Отчего com сервер может не стартовать inproc именно на x86 системе, ведь мой клиент, сервер и сама система 32 разрядные. Может это баг оутлука.
2. Как-то решить проблемму с различным интегрити. Погуглив эту проблемму, заметил что она довольно распространенная, но решений не нашел. (В основном предлагают править ком сервер, в моем случае это невозможно)
3. Гнусные хаки типа попросить пользователя закрыть оутлук, убить прцесс или отключить ему мутекс, что бы запустился еще один экземпляр.
Тут кстати тоже есть одна проблемма, после того как пофейлился CoCreateInstance, процесс winmail.exe нельзя закрыть, можно только убить.

У кого каке мыслишки есть по поводу всего этого безобразия ?
Re: Ошибка создания ISoreNamespace (outlook) в Vista x86
От: Vi2 Удмуртия http://www.adem.ru
Дата: 01.10.10 16:18
Оценка: +1
Здравствуйте, kinetix, Вы писали:

K>Поинвестигейтив проблеммку пришел к след выводам:

K>На других системах (например виста 64) ком сервер стартует inproc. В моем случае ком сервер как inproc по непонятным причинам не стартует. Пытается стартовать как LOCAL_SERVER. Видит что интегрити разные, стартует еще один екземпляр winmail.exe. winmail.exe сделан как синглтон, поэтому запуск второго эекземпляра фейлится, CoCreateInstance тоже фейлится.

K>Проблемму, как я понимаю можно решить несколькими способами на разных этапах:

K>1. Отчего com сервер может не стартовать inproc именно на x86 системе, ведь мой клиент, сервер и сама система 32 разрядные. Может это баг оутлука.

Поскольку речь всё время идёт о winmail.exe, то поясни, почему ты употребляешь выражение "На других системах ... ком сервер стартует inproc"? Экзешниик никогда не будет стартовать in-proc, это не его ипостась.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Ошибка создания ISoreNamespace (outlook) в Vista x86
От: Аноним  
Дата: 02.10.10 09:30
Оценка:
Vi2>Поскольку речь всё время идёт о winmail.exe, то поясни, почему ты употребляешь выражение "На других системах ... ком сервер стартует inproc"? Экзешниик никогда не будет стартовать in-proc, это не его ипостась.

У меня небольшой опыт работы с ком, поэтому с терминологией тоже не очень.
На 64 разрядной системе тоже есть winmail.exe, только их два: 32 и 64 разрядная версия.
"сервер стартует inproc" следует читать "объект создается inproc".
Re[2]: Ошибка создания ISoreNamespace (outlook) в Vista x86
От: Jolly Roger  
Дата: 02.10.10 11:34
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Поскольку речь всё время идёт о winmail.exe, то поясни, почему ты употребляешь выражение "На других системах ... ком сервер стартует inproc"? Экзешниик никогда не будет стартовать in-proc, это не его ипостась.


Видимо он пытается сказать, что в проблемном случае COM пытается запустить новый экземпляр winmail.exe А упоминание " Интегрити левел сервера и клиента отличны" наводит на мысль о настройках безопасности, в смысле, что запуск стоит as invoker. Думаю, надо просто через MMC назначить этому winmail.exe запуск от interactive user.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.