سؤال

لدي التطبيق التالي للتحقق من البرامج المثبتة في النظام:

#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 على المستوى المناسب، ويجب أن تحصل على الرموز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top