Russian Qt Forum
Ноябрь 23, 2024, 14:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: MsiEnumProducts + QT  (Прочитано 3499 раз)
inri13666
Гость
« : Август 05, 2010, 11:30 »

Доброго времени суток всем.
Появилась необходимость получить список прог на виндозных машинах, вроде все нормально есть у Микрософта такой прибомбас как Микрософт Инсталлер и вроде всё хорошо но чет если получать список прог то только код первой отображается а остальных нет в чём дело может кто подскажет=)

Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QLibrary>
#include <iostream>
#include "stdio.h"
#include "conio.h"
#include <QDebug>
#include <stdlib.h>
#ifdef WIN32
#include <tchar.h>
#endif
 
using namespace std;
#ifdef UNICODE
#define QStringToTCHAR(x)     (wchar_t*) x.utf16()
#define PQStringToTCHAR(x)    (wchar_t*) x->utf16()
#define TCHARToQString(x)     QString::fromUtf16((ushort*)(x))
#define TCHARToQStringN(x,y)  QString::fromUtf16((ushort*)(x),(y))
#else
#define QStringToTCHAR(x)     x.local8Bit().constData()
#define PQStringToTCHAR(x)    x->local8Bit().constData()
#define TCHARToQString(x)     QString::fromLocal8Bit((x))
#define TCHARToQStringN(x,y)  QString::fromLocal8Bit((x),(y))
#endif /*UNICODE*/
//======================================================================
// Some common types for char set portable code
#ifdef _UNICODE
#ifdef __linux__
#include <wchar.h>
#endif
#ifndef LPCTSTR
#define LPCTSTR const wchar_t *
#endif /* LPCTSTR */
#ifndef LPTSTR
#define LPTSTR wchar_t *
#endif /* LPTSTR */
#ifndef TCHAR
#define TCHAR wchar_t
#endif /* TCHAR */
#else
#ifndef LPCTSTR
#define LPCTSTR const char *
#endif /* LPCTSTR */
#ifndef LPTSTR
#define LPTSTR char *
#endif /* LPTSTR */
#ifndef TCHAR
#define TCHAR char
#endif /* TCHAR */
#endif
#ifndef FALSE
#define FALSE 0
#endif /* FALSE */
#ifndef TRUE
#define TRUE 1
#endif /* TRUE */
 
#define ERROR_BAD_CONFIGURATION 1610
#define ERROR_INVALID_PARAMETER 87
#define ERROR_NO_MORE_ITEMS 259
#define ERROR_NOT_ENOUGH_MEMORY 8
#define ERROR_SUCCESS 0
 
//======================================================================
#define UINT unsigned int
#define DWORD unsigned long
//======================================================================
typedef UINT (*MsiEnumProductsP)(DWORD,LPTSTR);
//======================================================================
LPTSTR getapp(DWORD ind)
{
   QLibrary msi("msi.dll");
   LPTSTR ret = NULL;
   DWORD index = ind;
   //qDebug()<<ind;//Если убрать то QT 4.6.3 + MinGW x.x.x Зацикливание =(
   if(msi.load())
   {
       //==================================
       LPTSTR ProductCode = new TCHAR[39];
       for(int i = 1;i<39;i++)
           ProductCode[i]='\0';
       //==================================
       MsiEnumProductsP test = (MsiEnumProductsP) (msi.resolve("MsiEnumProductsA"));
       //==================================
       if(test)
       {
           unsigned int nResult = test(index,ProductCode);
 
           switch(nResult)
           {
           case ( ERROR_BAD_CONFIGURATION):
               ret = "ERROR_BAD_CONFIGURATION";
               break;
           case ( ERROR_INVALID_PARAMETER):
               ret = "ERROR_INVALID_PARAMETER";
               break;
           case ( ERROR_NO_MORE_ITEMS):
               ret = "ERROR_NO_MORE_ITEMS";
               break;
           case ( ERROR_NOT_ENOUGH_MEMORY):
               ret = "ERROR_NOT_ENOUGH_MEMORY";
               break;
           case ( ERROR_SUCCESS):
               ret = ProductCode;
               break;
           default :
           ret = "ERROR_NO_INFORMATION";
           break;
       }
       }
       else
       {
           //=)
       }
       msi.unload();
   }
   return ret;
}
//======================================================================
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   for (UINT ix=0;ix<10;ix++)
   {
       LPTSTR tmp = getapp(ix);
       if(tmp!=NULL)
       {
           if(QString(tmp).length()!=0)
           {
               //std::cout<<"Result : "<<tmp<<std::endl;
               qDebug()<<"Result : "<<tmp;
           }
       }
       else
       {
       }
   }
 
   std::cout<< "Press Any Key To Exit\n";
   cin.ignore();
   return  0;//a.exec();
}
 

Вывод:
Код:
Result :  {5FD88490-011C-4DF1-B886-F298D955171B}
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Result :  ERROR_INVALID_PARAMETER
Press Any Key To Exit

В аттаче проект.
Заранее всем спасибо.
« Последнее редактирование: Август 05, 2010, 16:31 от inri13666 » Записан
inri13666
Гость
« Ответ #1 : Август 05, 2010, 16:36 »

Нашел пример на VC++ там всё работает ок

Пример от Микрософта


И на выходе :
Код:
    0 - {5FD88490-011C-4DF1-B886-F298D955171B}
    1 - {69FDFBB6-351D-4B8C-89D8-867DC9D0A2A4}
    2 - {7C1FB62F-36ED-46FB-B83A-17AFC660EC6B}
    3 - {90120000-0030-0000-0000-0000000FF1CE}
    4 - {90120000-0051-0000-0000-0000000FF1CE}
    5 - {90120000-00A1-0419-0000-0000000FF1CE}
    6 - {90120000-0044-0419-0000-0000000FF1CE}
    7 - {90120000-0054-0419-0000-0000000FF1CE}
    8 - {90120000-00A4-0419-0000-0000000FF1CE}
    9 - {90120000-0015-0419-0000-0000000FF1CE}

В чём проблема не пойму может с типами или еще чемнить... ладано скачаю QT SDK постарше может проблема в QT или MinGW.
Записан
inri13666
Гость
« Ответ #2 : Август 11, 2010, 09:28 »

Всё разобрался=) Если кому интересно, то в аттаче рабочая версия проекта.
З.Ы. на вин7 требут запуска от админа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 20.