Pergunta

Eu tenho o seguinte aplicativo para verificar programas instalados em um 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);
}

Estou usando o Microsoft Visual C++ Express 2010.O aplicativo é MBCS.No estúdio, essas quatro coisas estão em vermelho (erro):

  • MSIINSTALLCONTEXT_ALL
  • MSIINSTALLCONTEXT
  • MsiEnumProductsEx
  • MsiGetProductInfoEx

Vinculei o Msi.lib (Propriedades do projeto -> Vinculador -> Entrada -> Dependências Adicionais).Estou apenas tentando descobrir como MsiEnumProductsEx função funciona.Sei que existem outras dúvidas por aí, mas simplesmente não consigo entender porque não está funcionando porque acho que tenho tudo para que as funções estejam disponíveis, pelo menos.Obrigado!

Foi útil?

Solução

O MSIINSTALLCONTEXT_ALL (e identificadores relacionados) são definidos em <msi.h> somente se _WIN32_MSI >= 300.Você precisa informar ao SDK do Windows qual é a versão mínima do sistema operacional que você deseja, definindo algumas macros antes de instalar qualquer cabeçalho do SDK (como <msi.h> ou <windows.h>).

Você faz isso de acordo com isso Página MSDN.

Depois de definir uma versão mínima adequada (semelhante ao Windows XP SP2 e superior), então _WIN32_MSI será definido para um nível apropriado e você deverá obter os símbolos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top