MsiEnumProductsEx لا يعمل
-
08-09-2020 - |
سؤال
لدي التطبيق التالي للتحقق من البرامج المثبتة في النظام:
#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);
}
أنا أستخدم Microsoft Visual C++ Express 2010.التطبيق هو MBCS.في الاستوديو، هذه الأشياء الأربعة باللون الأحمر (خطأ):
MSIINSTALLCONTEXT_ALL
MSIINSTALLCONTEXT
MsiEnumProductsEx
MsiGetProductInfoEx
لقد قمت بربط Msi.lib (خصائص المشروع -> الرابط -> الإدخال -> التبعيات الإضافية).أنا فقط أحاول معرفة كيف MsiEnumProductsEx
تعمل الوظيفة.أعلم أن هناك أسئلة أخرى مطروحة، لكني لا أستطيع أن أفهم سبب عدم نجاحها لأنني أعتقد أن لدي كل شيء لتكون الوظائف متاحة، على الأقل.شكرًا!
المحلول
يتم تعريف MSIINSTALLCONTEXT_ALL (والمعرفات ذات الصلة) في <msi.h>
فقط إذا كان _WIN32_MSI >= 300.يجب عليك إخبار Windows SDK بالحد الأدنى لإصدار نظام التشغيل الذي تستهدفه، عن طريق تحديد عدد قليل من وحدات الماكرو قبل تثبيت أي رؤوس SDK (مثل <msi.h>
أو <windows.h>
).
أنت تفعل ذلك وفقا لهذا صفحة MSDN.
بمجرد تحديد الحد الأدنى المناسب من الإصدار (يشبه Windows XP SP2 والإصدارات الأحدث)، سيتم تعيين _WIN32_MSI على المستوى المناسب، ويجب أن تحصل على الرموز.