0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
1

Невозможно инициализировать CoInitializeSecurity после вызова CFileDialog

06.04.2013, 02:28. Показов 8298. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я на форуме новичек, так что за изложение сильно не ругайте.
В общем проблема такая, после вывода на экран диалогового окна выбора файла (CFileDialog) (думаю записи тоже,настроек принтера и т.д. т.к. вроде это все тоже COM) , нивкакую невозможно инициализировать CoInitializeSecurity.

Пример инициализации брал даже с сайта M$ http://msdn.microsoft.com/en-u... s.85).aspx

В общем как то так:
1) Создал проект с окном в VS2008 c++ DialogBased - MFC (в общем как то так)
2) Повесил 2 кнопки, одна типа открыть диалог - Вторая сделать инициализацию COM (мне нужно WMI)
Так вот, если хоть 1000 раз клацать вторую кнопку, то все ОК. Но вот если хоть раз вызвать FileDialog, то инициализация уже не проиcходит.
Куски кода прилагаю:

1) Вызов Диалога открытия файла
C++
1
2
CFileDialog fileDialog(TRUE,NULL,L"*.ldq"); 
fileDialog.DoModal();
2) Собственно инициализация COM
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 HRESULT hres;
 
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        
       AfxMessageBox(L"Failed to initialize COM library. Error code = 0x"); 
            
        return ;                  // Program has failed.
    }
 
    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
 
                      
    if (FAILED(hres))
    {
        AfxMessageBox(L"Failed to initialize security. Error code = 0x"); 
        CoUninitialize();
        return ;                    // Program has failed.
    }
         AfxMessageBox(L"initialize security OK");

В общем не знаю как победить, такое ощущение что это реально баг не мой)))
Может сталкивался кто.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2013, 02:28
Ответы с готовыми решениями:

(MFC) После вызова CFileDialog окно выглядит неактивным
Вызываю по пункту меню диалог открытия файла таким образом: CFileDialog dlg(true); int...

Невозможно применить семейство Request.Form после вызова BinaryRead
Добрый день, подскажите, кто знает! Загружаю с помощью кода файл, после чего пытаюсь получить...

После вызова печати, я хочу попасть на ту форму что вызывала, и на то поле где была до вызова
Например я в форме на каком-то поле Вызываю с формы отчет, потом закрываю отчет, и моя форма...

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include <iostream> #include <conio.h> using namespace std; int n, *c; void fun(int a,...

7
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
08.04.2013, 13:19 2
если инит падает значит он уже был (мб в недрах диалога). если прям очень нужно сделать инит еще раз - делайте перед ним анинит

Добавлено через 3 минуты
а. пардон. это я просто про CoInitializeEx. что касается CoInitializeSecurity - а зачем страдать - вызовете ее до диалога

Добавлено через 43 секунды
кстати я всегда использую
C++
1
2
3
4
5
6
7
8
9
10
11
12
hr = CoInitializeSecurity
    (
        0, //IN PSECURITY_DESCRIPTOR pSecDesc
        -1, //IN LONG cAuthSvc
        0, //IN SOLE_AUTHENTICATION_SERVICE *asAuthSvc
        0, //IN void *pReserved1
        RPC_C_AUTHN_LEVEL_PKT, //IN DWORD dwAuthnLevel
        RPC_C_IMP_LEVEL_IMPERSONATE, //IN DWORD dwImpLevel
        0, //IN void *pAuthList
        EOAC_NONE, //IN DWORD dwCapabilities
        0 //IN void *pReserved3
    );
Добавлено через 42 секунды
...и хоть бы код ошибки показали
0
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
08.04.2013, 16:04  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
если инит падает значит он уже был (мб в недрах диалога). если прям очень нужно сделать инит еще раз - делайте перед ним анинит
Делал CoUnInitialize. В общем ничего не помогает.
CoInitializeSecurity возвращает (RPC_E_TOO_LATE) типа повторная инициализация, код GetLastError возвращает 1008.(ERROR_NO_TOKEN 1008 (0x3F0)
An attempt was made to reference a token that does not exist.)

Реально не могу понять что за ерунда. FileDialog это походу COM, и я так понимаю после закрытия он не делает CoUnitialize. Можно ли как то принудительно сделать анинит ФайлДиалога?

Насчет вызывать до ФайлДиалога, я так и сделал. Но это тоже как бы ерунда какая то. Там функция такая что ее можно вызвать 1 раз(WMI опрос конфигурации). Если ее вызвать еще раз, то все падает. Оно то конечно можно сделать обертку для этого в каком то глобальном классе, инициализировать все в самом начале программы, но я так понимаю то тогда я UnInit тоже не смогу сделать и тогда проблема может возникнуть с каким нибуть другим COM.
Либо действительно ФайлДиалог где то юзает WMI и не закрывает его. Попробую сейчас открыть ине закрыть свой WMI и вызвать файл Диалог.
Попробовал, файл диалог нормально открывается, значит он как то все закрывает. Мож кто знает как такое сделать.


Попробовал вызвать с Вашими параметрами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
hr = CoInitializeSecurity
    (
        0, //IN PSECURITY_DESCRIPTOR pSecDesc
        -1, //IN LONG cAuthSvc
        0, //IN SOLE_AUTHENTICATION_SERVICE *asAuthSvc
        0, //IN void *pReserved1
        RPC_C_AUTHN_LEVEL_PKT, //IN DWORD dwAuthnLevel
        RPC_C_IMP_LEVEL_IMPERSONATE, //IN DWORD dwImpLevel
        0, //IN void *pAuthList
        EOAC_NONE, //IN DWORD dwCapabilities
        0 //IN void *pReserved3
    );
Результат тот же.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
09.04.2013, 13:35 4
делайте инит в начале программы и анинит в конце
0
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
10.04.2013, 12:27  [ТС] 5
Цитата Сообщение от vxg Посмотреть сообщение
делайте инит в начале программы и анинит в конце
Так и делаю.
Просто интересно было, это реально бага M$ или моя.
Или может особенность какая то.
Просто в инете как то об этом на англоязычных сайтах вроде что то и встречал, но блин с английским не сложилось у меня.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
10.04.2013, 12:50 6
это связано с тем что какой-то компонент для своих нужд уже поднял COM. причем вам повезло что вы смогли сделать то что хотели просто играя в пятнашки. они могли бы зарыть инициализацию в статическом объекте модуля и тогда был бы ппц
0
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
10.04.2013, 13:57  [ТС] 7
Цитата Сообщение от vxg Посмотреть сообщение
это связано с тем что какой-то компонент для своих нужд уже поднял COM. причем вам повезло что вы смогли сделать то что хотели просто играя в пятнашки. они могли бы зарыть инициализацию в статическом объекте модуля и тогда был бы ппц
Это мне повезло что мое приложение может обойтись одним вызовом WMI в самом начале проекта(сканирую конфиг компа через WMI и записываю в глобальный класс).
Т.е. в моем случае проблема решена.
Но хочется узнать как ее можно побороть действительно.
Т.к. получается при использовании диалога Сохранения/Загрузки, я автоматически лишаюсь возможности пользоваться WMI в любом куске своей программы. Оно то конечно можно просканировать АБСОЛЮТНО ВСЕ в самом начале программы в глобальные классы/переменные и потом просто вываливать, но вроде некрасиво как то, такое вот решение. А вдруг я тоже напишу какой то диалог COM, и я попросту тоже не смогу его вызвать в произвольном месте.
Наверное всетакие есть какое то решение, чтоб можно было сделать Анинит.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
10.04.2013, 23:04 8
Цитата Сообщение от oborskiy Посмотреть сообщение
есть какое то решение
решение в том чтобы вызвать инит самому до того как к нему доберутся те руки которые вы хотите поотрывать.
листаем например здесь http://msdn.microsoft.com/en-u... s.85).aspx (см. "The CoInitializeSecurity function initializes the security layer and sets the specified values as the security default. If a process does not call CoInitializeSecurity, COM calls it automatically the first time an interface is marshaled or unmarshaled, registering the system default security."
как вариант пробуем копать CoSetProxyBlanket http://msdn.microsoft.com/en-u... 92692.aspx

Добавлено через 14 секунд
Цитата Сообщение от oborskiy Посмотреть сообщение
есть какое то решение
решение в том чтобы вызвать инит самому до того как к нему доберутся те руки которые вы хотите поотрывать.
листаем например здесь http://msdn.microsoft.com/en-u... s.85).aspx (см. "The CoInitializeSecurity function initializes the security layer and sets the specified values as the security default. If a process does not call CoInitializeSecurity, COM calls it automatically the first time an interface is marshaled or unmarshaled, registering the system default security."
как вариант пробуем копать CoSetProxyBlanket http://msdn.microsoft.com/en-u... 92692.aspx
0
10.04.2013, 23:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2013, 23:04
Помогаю со студенческими работами здесь

Невозможно инициализировать enum целыми числами
enum CellType { EXCEPTION = -1, SPACE = 0, WALL = 1, TANK = 2,...

оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ
оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова;...

CoInitializeSecurity Error(RPC_E_TOO_LATE 0x80010119)
Здравствуйте! Существует нативная С++ библиотека с разными функциями для разных задач, одной из...

Многоточие после вызова функции
Приветствую зашедших - возможно кто-нибудь подскажет, что означает/делает многоточие в конце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru