MSI 제품 코드가 주어지면 이미 설치된 제품의 업그레이드 코드 (다른 속성들 중에서)를 얻고 싶습니다. MsiOpenProduct 메서드를 호출하고 MsiGetProductProperty()를 호출하여이 작업을 시도했습니다. (약칭 함) 예는 다음과 같습니다MsiOpenProduct는 설치된 제품에서 속성을 읽는 올바른 방법입니까?
MSIHANDLE handle = NULL;
MsiOpenProduct(strProductCode,&handle);
CString strUpgradeCode;
MsiGetProductProperty(handle,_T("UpgradeCode"), strUpgradeCode.GetBuffer(GUID_LENGTH), &dwSize);
strUpgradeCode.ReleaseBuffer();
MsiCloseHandle(handle);
이 나에게 원하는 값을 가져오고 MSDN 설명서에서 판단하기는이 할 수있는 유효한 방법처럼 보인다 :
이MsiOpenProduct 함수는이 열립니다 제품 데이터베이스에 액세스하는 기능과 함께 사용하는 제품입니다. 핸들이 길어지면 MsiCloseHandle 함수를 핸들과 함께 이라고 호출해야합니다.
그러나 MsiOpenProduct()를 호출하면 "Windows 설치 프로그램이 설치 준비 중입니다 ..."대화 상자가 나타납니다. MsiCloseHandle()을 호출하면 다시 사라집니다.
MsiOpenProduct에 전화를 (무엇을- )는 후드 아래에 수행
이
궁금 저를 왼쪽? 나는 어떤 행동을 촉발시키고 싶지 않습니다. 단지 속성을 읽고 싶습니다. - 이것은 부작용이없는 한 단위 테스트 코드에만 해당되므로 대화 상자가 나타나지 않도록 신경 써야합니다. 이 작업을 수행하는 많은 단위 테스트가 있으므로 신속하게 연속적으로 핸들을 열고 닫을 때 작동해야합니다.
- MsiGetProductInfo 메서드를 발견했지만 업그레이드 코드를 얻을 수있는 방법이없는 것으로 보입니다. 내가 맞습니까?
- MsiOpenProduct는 업그레이드 코드와 같은 속성을 읽는 올바른 방법입니까?
같은 결론에 도달했습니다 - 나는 VBScript의 OpenProduct를 사용하여 UpgradeCode (COM 호출, C++ 호출과 다름)를 얻습니다. 최상위 레벨 설치자 객체에 대한 UILevel 속성을 설정하여 사용자가 말하는 GUI를 표시하지 않습니다. 업그레이드 코드를 얻는 다른 방법은 WMI를 사용하는 것입니다 :'Select * from Win32_Property Where Property = 'UpgradeCode ''. 특정 제품 코드의 경우 : 'SELECT * FROM Win32_Property WHERE 속성 = 'UpgradeCode'AND ProductCode = '{B862B671-59FD-7457-AFA0-C738FB7ABD60}' '. 아마도이 정보가 VBScript 임에도 불구하고 아래에 답변을 추가해야합니다. –