Доброго времени суток всем.
Появилась необходимость получить список прог на виндозных машинах, вроде все нормально есть у Микрософта такой прибомбас как Микрософт Инсталлер и вроде всё хорошо но чет если получать список прог то только код первой отображается а остальных нет в чём дело может кто подскажет=)
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
В аттаче проект.
Заранее всем спасибо.