سؤال

لقد قمت بإنشاء ملف MSI مع WIX. يحتوي ملف WIX المصدر على معلومات الإصدار مثل هذا:

<Product Id="..." 
         Name="..." 
         Language="1033" 
         Version="1.0.0.1" 
         Manufacturer="..." 
         UpgradeCode="...">

يبدو أن ملف MSI يعمل بشكل جيد: إنه يتم تثبيته ، ويقوم بإلغاء تثبيته ، ويقوم بالترقية عندما أقوم بزيادة رقم الإصدار ، إلخ.

ومع ذلك ، عندما أحاول الحصول على معلومات الإصدار حول هذا الملف عن طريق الاتصال بأجهزة API MSIGETFileVersion () ، فإنه يعيد خطأ 1006 (خطأ error_file_invalid لا يحتوي على معلومات الإصدار.)

ومن هنا سؤالي: كيف (برمجيا ، في C ++) استرداد رقم الإصدار من ملف MSI؟ أو ، بعبارة أخرى ، حيث يجب أن يتم استرداد معلومات الإصدار في ملف WIX حتى يتم استردادها عبر msigetfileversion ()؟

مزيد من المعلومات: يحدث الخطأ نفسه مع MSI 3.0 على Windows XP و MSI 4.0 على Vista.

هل كانت مفيدة؟

المحلول

فقط من أجل الاكتمال ، :: msigetfileversion () هي وظيفة تقرأ معلومات مورد الإصدار من ملف pe (.exe أو .dll) نفس طريقة تثبيت Windows. هذا مهم لأدوات البناء (مثل مجموعة أدوات WIX) لاستخدامها حتى يقوموا بتعبئة معلومات الملف/@@الإصدار بشكل صحيح. لن تحصل على معلومات الإصدار من MSI. كما يوضح Sascha أنه يمكنك الاستعلام عن جدول العقارات لـ "Productversion" أو يمكنك استخدام ::: MsIgetProductProperty () الذي سيفعل الشيء نفسه.

نصائح أخرى

للرجوع إليها ، إليك مثال VBScript الذي أستخدمه في عملية الإنشاء الخاصة بي للاستيلاء على هذا قبل إنشاء boostrapper.

Dim installer, database, view, result

Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("my.msi", 0)

Dim sumInfo  : Set sumInfo = installer.SummaryInformation("my.msi", 0)
sPackageCode =  sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.

WScript.Echo getproperty("ProductVersion")
WScript.Echo getproperty("ProductVersion")
WScript.Echo sPackageCode
WScript.Echo getproperty("ProductName")


Function getproperty(property)

    Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
    view.Execute
    Set result = view.Fetch
    getproperty = result.StringData(1)

End Function 

Found a solution: instead of calling MsiGetFileVersion(), call:

MSIHANDLE hProduct = NULL;
MsiOpenPackage( pszPath, &hProduct );

MsiGetProductProperty( hProduct, _T("ProductVersion"), pszVersion, &dwSizeVersion );

MsiCloseHandle( hProduct );

(error handling omitted)

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