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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top