2016-06-02 11 views
1

Es ist Microsoft Office 2013 auf meinem PC installiert. Ich versuche MsiGetProductInfo zu verwenden, um Informationen über dieses Produkt abzufragen (tatsächlich muss ich prüfen, ob Word installiert ist).Verwenden Sie MsiGetProductInfo, um zu überprüfen, ob Microsoft Word installiert ist

Aber der folgende C++ - Code gibt immer mit einem Fehler 1605 (ERROR_UNKNOWN_PRODUCT) zurück, was bedeutet, dass das Produkt nicht installiert zu sein scheint, obwohl es in der Liste der installierten Anwendungen vorhanden ist.

TCHAR szVersion[20]; 
DWORD cchVersion = 20; 
LSTATUS st = MsiGetProductInfo(TEXT("{000209FF-0000-0000-C000-000000000046}"), INSTALLPROPERTY_VERSIONSTRING, szVersion, &cchVersion); 

classid {000209FF-0000-0000-C000-000000000046} wird in der Registrierung in HKLM\Software\Classes\Word.Application\CLSID gefunden und ich nehme an, es für Microsoft Word Anwendung CLSID bleiben sollte.

Wie wird MsiGetProductInfo richtig verwendet, um zu überprüfen, dass MS Word installiert ist?

Antwort

3

MsiGetProductInfo akzeptiert Produktcodes, nicht CLSIDs, daher funktioniert diese Methode nicht. Wenn Sie alle Produktcodes kennen, die von Microsoft Office verwendet werden (ich habe gehört, dass es Hunderte von SKUs gibt, was Hunderte oder Produktcodes bedeuten könnte), könnten Sie alle nacheinander suchen. Aber wenn sie nicht nur ein paar Produktcodes haben und keine neuen hinzufügen (oder neue Versionen nicht unterstützen), wird dies nicht skaliert.

Sie sind möglicherweise besser dran, den Registrierungs-Footprint für die Word.Application-Klasse zurück zu einem COM-Server und den Versionsblock für diese Datei zu verfolgen. Oder, vorausgesetzt, es wird von einem MSI installiert, können Sie versuchen, MsiEnumComponentsEx zu verwenden, um die Datei zu seiner installierenden Komponente zu verfolgen, und MsiEnumClientsEx, um das Produkt (oder die Produkte) zu finden, das diese Komponente installiert hat. Und von dort könntest du zu MsiGetProductInfo zurückkehren.

Beachten Sie, dass dies nur funktioniert, wenn das Produkt über MSI installiert wurde und einen Footprint in der Registrierung hinterlässt. Es ist schwer zu sagen, ob zukünftige Versionen diesem Ansatz folgen werden. Anscheinend installieren nicht alle vorhandenen Produkte via MSI: Can't find installed Office 2013 Home and business with MsiEnumProducts.