Frage

Ich habe die folgende Anwendung, um installierte Programme in einem System zu überprüfen:

#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);
}

Ich verwende Microsoft Visual C++ Express 2010.Die Anwendung ist MBCS.Im Studio sind diese vier Dinge rot (Fehler):

  • MSIINSTALLCONTEXT_ALL
  • MSIINSTALLCONTEXT
  • MsiEnumProductsEx
  • MsiGetProductInfoEx

Ich habe die Msi.lib verlinkt (Projekteigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten).Ich versuche nur herauszufinden, wie MsiEnumProductsEx Funktion funktioniert.Ich weiß, dass es noch andere Fragen gibt, aber ich kann einfach nicht verstehen, warum es nicht funktioniert, weil ich denke, dass ich zumindest alles habe, damit die Funktionen verfügbar sind.Danke!

War es hilfreich?

Lösung

Die MSIINSTALLCONTEXT_ALL (und zugehörigen Bezeichner) sind in definiert <msi.h> Nur wenn _WIN32_MSI >= 300.Sie müssen dem Windows SDK mitteilen, auf welche Mindestversion des Betriebssystems Sie abzielen, indem Sie einige Makros definieren, bevor Sie SDK-Header installieren (z. B <msi.h> oder <windows.h>).

Das machen Sie entsprechend MSDN-Seite.

Sobald Sie eine geeignete Mindestversion definiert haben (sieht aus wie Windows XP SP2 und höher), wird _WIN32_MSI auf eine entsprechende Stufe gesetzt und Sie sollten die Symbole erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top