MsiEnumProductsEx funktioniert nicht
-
08-09-2020 - |
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!
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.