문제

시스템에서 설치된 프로그램을 확인하려면 다음과 같은 응용 프로그램이 있습니다.

#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

i msi.lib (프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성)를 연결했습니다.나는 MsiEnumProductsEx 기능이 작동하는 방식을 알아 내려고 노력하고 있습니다.나는 다른 질문이 있다는 것을 알고 있지만, 적어도 함수를 사용할 수있는 모든 것을 가지고 있다고 생각하기 때문에 왜 작동하지 않는지 이해할 수는 없습니다.감사합니다!

도움이 되었습니까?

해결책

MSIInstallContext_All (관련 식별자)은 _win32_msi>= 300 인 경우에만 <msi.h>에서 정의됩니다. Windows SDK에 타겟팅중인 최소 OS 버전이 SDK 헤더를 설치하기 전에 몇 가지 매크로를 정의해야합니다 (<msi.h> 또는 <windows.h>처럼).

"Nofollow"> MSDN 페이지.

Windows XP SP2 및 UP와 같은 적절한 최소 버전 (Windows XP SP2 및 UP)처럼 보이는 경우 _win32_msi가 적절한 레벨로 설정되고 기호를 가져와야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top