MsiEnumProductsEx no funciona
-
08-09-2020 - |
Pregunta
Tengo la siguiente aplicación para verificar los programas instalados en un sistema:
#include <iostream>
#include <Msi.h>
#include <Windows.h>
using namespace std;
void main()
{
UINT ret;
DWORD dwIndex = 0;
DWORD dwContext = MSIINSTALLCONTEXT_ALL;
char szInstalledProductCode[39] = {0};
char szSid[128] = {0};
const char* szUserSid = "s-1-1-0";
DWORD cchSid;
MSIINSTALLCONTEXT dwInstalledContext;
do
{
memset(szInstalledProductCode, 0, sizeof(szInstalledProductCode));
cchSid = sizeof(szSid)/sizeof(szSid[0]);
ret = MsiEnumProductsEx(
NULL, // all the products in the context
szUserSid, // i.e.Everyone, all users in the system
dwContext,
dwIndex,
szInstalledProductCode,
&dwInstalledContext,
szSid,
&cchSid
);
if(ret == ERROR_SUCCESS)
{
char* name = MsiGetProductInfoEx (
szInstalledProductCode,
cchSid == 0 ? NULL : szSid,
dwInstalledContext,
INSTALLPROPERTY_INSTALLEDPRODUCTNAME
);
char* version = MsiGetProductInfoEx (
szInstalledProductCode,
cchSid == 0 ? NULL : szSid,
dwInstalledContext,
INSTALLPROPERTY_VERSIONSTRING
);
cout << name << endl;
cout << " - " << version << endl;
dwIndex++;
}
} while(ret == ERROR_SUCCESS);
}
Estoy usando Microsoft Visual C++ Express 2010.La aplicación es MBCS.En estudio, estas cuatro cosas están en rojo (error):
MSIINSTALLCONTEXT_ALL
MSIINSTALLCONTEXT
MsiEnumProductsEx
MsiGetProductInfoEx
Vinculé Msi.lib (Propiedades del proyecto -> Vinculador -> Entrada -> Dependencias adicionales).Sólo estoy tratando de descubrir cómo MsiEnumProductsEx
La función funciona.Sé que hay otras preguntas, pero no puedo entender por qué no funciona porque creo que tengo todo para que las funciones estén disponibles, al menos.¡Gracias!
Solución
MSIINSTALLCONTEXT_ALL (y los identificadores relacionados) se definen en <msi.h>
sólo si _WIN32_MSI >= 300.Debe indicarle al SDK de Windows cuál es la versión mínima del sistema operativo a la que se dirige, definiendo algunas macros antes de instalar cualquier encabezado del SDK (como <msi.h>
o <windows.h>
).
lo haces de acuerdo a esto página MSDN.
Una vez que haya definido una versión mínima adecuada (parece Windows XP SP2 y superior), _WIN32_MSI se configurará en un nivel apropiado y debería obtener los símbolos.