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
i msi.lib (프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성)를 연결했습니다.나는 MsiEnumProductsEx
기능이 작동하는 방식을 알아 내려고 노력하고 있습니다.나는 다른 질문이 있다는 것을 알고 있지만, 적어도 함수를 사용할 수있는 모든 것을 가지고 있다고 생각하기 때문에 왜 작동하지 않는지 이해할 수는 없습니다.감사합니다!
해결책
MSIInstallContext_All (관련 식별자)은 _win32_msi>= 300 인 경우에만 <msi.h>
에서 정의됩니다. Windows SDK에 타겟팅중인 최소 OS 버전이 SDK 헤더를 설치하기 전에 몇 가지 매크로를 정의해야합니다 (<msi.h>
또는 <windows.h>
처럼).
Windows XP SP2 및 UP와 같은 적절한 최소 버전 (Windows XP SP2 및 UP)처럼 보이는 경우 _win32_msi가 적절한 레벨로 설정되고 기호를 가져와야합니다.
제휴하지 않습니다 StackOverflow