Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с WMI: класс StdRegProv c методом EnumKey, Работа с технологией WMI 
V
    Опции темы
redman1986
Дата 19.3.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Добрый день...  помогите пожалуйста разобраться с работой класса StdRegProv и в частности запустить метод EnumKey для того чтобы считать из реестра список программного обеспечения....   smile  Столкнулся с этой проблемой... Уже много чего пересмотрел.... Алгоритм понятен но везде примеры скриптовые.... если есть реальные примеры работы просьба выложить на обозрение   smile  
PM MAIL   Вверх
Rififi
Дата 20.3.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



интересно, а зачем может понадобится StdRegProv не из скрипта? Reg* намного удобнее...

вот кусок моего древнего кода, для C++ делай по-аналогии

Код

RegistryMgr.prototype.EnumThisBranchKeys = function(cb, param)
{
    try
    {
        var refMethod = this.refRegistry.Methods_.Item("EnumKey");
        var refInParam = refMethod.InParameters.SpawnInstance_();
        refInParam.hDefKey = this.keyParent;
        refInParam.sSubKeyName = this.keyName;
        var refOutParam = this.refRegistry.ExecMethod_(refMethod.Name, refInParam);
        if (refOutParam.sNames == null) // no sub-keys
         return 0;
        var out = refOutParam.sNames.toArray();
        for(var i=0; i<out.length; i++)
            if (cb(i, out[i], param, this))
                return i;

        return ERROR_GENERIC;
    }

    catch(e)
    {
        DisplayMessage(e);
    }
}

PM MAIL   Вверх
redman1986
Дата 20.3.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Rififi спасибо тебе конечно за код.... он впринципе мало чем отличается от скриптового.... вот поидее как правильно надо делать.....
Код

        BSTR MethodName = SysAllocString(L"EnumKey");
    BSTR ClassName = SysAllocString(L"StdRegProv");

    IWbemClassObject* pClass = NULL;
    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

    if(SUCCEEDED(hres))
    {
        IWbemClassObject* pInParamsDefinition = NULL;
        hres = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);

        if(SUCCEEDED(hres))
        {
                IWbemClassObject* pClassInstance = NULL;
                hres = pInParamsDefinition->SpawnInstance(0,&pClassInstance);

                if(SUCCEEDED(hres))
                {
                    VARIANT varCommand;
                    
                    signed int il=0x80000002;
                    varCommand.vt = VT_I4;
                    varCommand.pintVal = &il;

                    hres = pClassInstance->Put(L"hDefKey", 0, &varCommand, 0);

                    varCommand.vt = VT_BSTR;
                    varCommand.bstrVal =  L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" ;

                    hres = pClassInstance->Put(L"sSubKeyName", 0, &varCommand, 0);

                
                    int i=0;
                        
                    string *mystr;
                    mystr = new string[10];
                    varCommand.vt = VT_ARRAY | VT_UNKNOWN;//!!!!!!!!!
                    varCommand.parray  = mystr ;//!!!!!!!!!


                    hres = pClassInstance->Put(L"sNames", 0, &varCommand, 0);//!!!!!!!!


                    // Execute Method
                    IWbemClassObject *pclsObj = NULL;
                    hres = pSvc->ExecMethod(ClassName, MethodName, 0, NULL, pClassInstance, &pclsObj, NULL);

                                  ////бла бла бла здесь выполняются какие либо действия на mystr
                              }
                 }
        }


Я конешно опустил некоторые моменты ( инициализацию COM, подсоединение к WMI).... 
Смысл моего вопроса заключается в  том что я немогу никак докопаться до истины  :dash1 что же должно быть на месте varCommand.vt в связке 
varCommand.vt = VT_ARRAY | VT_UNKNOWN;//!!!!!!!!!
varCommand.parray  = mystr ;//!!!!!!!!!
чтобы varCommand был аналогичен uint32 EnumKey(   uint32 hDefKey,  string sSubKeyName,   string sNames[] ); -----> string sNames[] и чтобы  hres = pClassInstance->Put(L"sNames", 0, &varCommand, 0);!!!!!!!! возвращал S_OK.... помогите плиз...  уже сил нет :dash1  

PM MAIL   Вверх
Rififi
Дата 20.3.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



redman1986,  
sNames - это out-параметр
соответственно ищи его в возвращаемом IWbemClassObject через Get. И будет это, скорее всего, VT_ARRAY | VT_VARIANT (в которых, на самом деле, BSTR), ибо vbscript кроме как с вариантом ни с чем работать не умеет.
PM MAIL   Вверх
redman1986
Дата 20.3.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Rififi спасибо за подсказку....
Код

long uReturn;
                    VARIANT vtProp;
                    char m_str[256];
                    VariantInit(&vtProp);
                    
                    while (pclsObj)
                    {
                        hres = pclsObj->Get(L"sNames", 0,&vtProp, 0, &uReturn);
                        if(0 == uReturn)
                        {
                                break;
                        }
                    }

но получается так что при вызове метода Get -> hres = S_OK, vtProp = null, uRetrun = 32 как ето объяснить???? помоги плиз на тебя одна надежда...  smile 
PM MAIL   Вверх
Rififi
Дата 20.3.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



я посмотрю сегодня, может что и удастся нарыть.
но ничего не обещаю, т.к. на c++ с stdregprov не работал.
PM MAIL   Вверх
Rififi
Дата 20.3.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



ну собстна, вот, посмотрел...
всё практически то же самое, только с учётом особенностей C++ и COM

замечания:
1. код без проверок на ошибки
2. комментариев нет (но думаю, они и не потребуются, ибо комментировать особо нечего).
3. все инклуды остались в stdafx.h
4. я пользуюсь ms-com/bstr-обертками для уменьшения энтропии (весь этот гемор с BSTR/VARIANT и "голыми" указателями мне нафик не упал).
5. проверено на vs2008

Код

_COM_SMARTPTR_TYPEDEF(IWbemClassObject, IID_IWbemClassObject);
_COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator);
_COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices);

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);

    try
    {
        IWbemLocatorPtr spLocator;
        IWbemServicesPtr spSvc;
        spLocator.CreateInstance(__uuidof(WbemLocator));
        spLocator->ConnectServer(_bstr_t(L"root\\default"), NULL, NULL, NULL, 0, NULL, NULL, &spSvc);
        HRESULT hr;
        
        if (FAILED(hr = CoSetProxyBlanket(spSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
            NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE)))
            throw _com_error(hr);

        IWbemClassObjectPtr spReg;
        IWbemClassObjectPtr spInParamDefinition;
        IWbemClassObjectPtr spOutParamDefinition;

        _bstr_t className = L"StdRegProv";
        _bstr_t methodName = L"EnumKey";

        spSvc->GetObject(className, 0, NULL, &spReg, NULL);
        spReg->GetMethod(methodName, 0, &spInParamDefinition, NULL);

        IWbemClassObjectPtr spClassInstance;
        
        _variant_t vtDefKey = (long) 0x80000002;
        _variant_t vtSubKeyName = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
        spInParamDefinition->SpawnInstance(0, &spClassInstance);
        spClassInstance->Put(L"hDefKey", 0, &vtDefKey, 0);
        spClassInstance->Put(L"sSubKeyName", 0, &vtSubKeyName, 0);
        
        spSvc->ExecMethod(className, methodName, 0, NULL, spClassInstance, &spOutParamDefinition, NULL);
        _variant_t vtRes;
        CIMTYPE cimType;
        spOutParamDefinition->Get(L"sNames", 0, &vtRes, &cimType, NULL);
        _ASSERTE(cimType == CIM_FLAG_ARRAY | CIM_STRING);
        CComSafeArray<BSTR> arr = vtRes.parray;
    }
    catch (_com_error& e)
    {        
    }

    CoUninitialize();
    return (0);
}

PM MAIL   Вверх
redman1986
Дата 24.3.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Rififi спасибо... помогло...  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.