Как читать код пакета с помощью пользовательских действий

Можно ли прочитать код пакета с помощью пользовательских действий, как чтение ProductCode и ProductName. Я хочу удалить кэш MSI, который создается в%LOCALAPPDATA%/Downloaded Installations/GUID, где GUID - это код пакета во время удаления.

2 ответа

Решение

Возможно, вы захотите взглянуть на этот код, который я написал некоторое время назад: (весь поток хорошо читается)

Локальный кэшированный MSI не удаляется при удалении

<CustomAction Id="PurgeCache_CAD_Install"  Execute="immediate" Property="PurgeCache" Value="/CacheRoot=[CommonAppDataFolder]Downloaded Installations\MyCompany\MyProduct /PackageCode=[PackageCode] /InstallMode=Install"/>
<CustomAction Id="PurgeCache_CAD_Uninstall" Execute="immediate" Property="PurgeCache" Value="/CacheRoot=[CommonAppDataFolder]Downloaded Installations\MyCompany\MyProduct /PackageCode=[PackageCode] /InstallMode=UnInstall"/>
<InstallExecuteSequence>
  <Custom Action="PurgeCache_CAD_Install" After="ScheduleReboot">Not REMOVE="ALL"/>
  <Custom Action="PurgeCache_CAD_Uninstall" After="ScheduleReboot">REMOVE="ALL"/>
</InstallExecuteSequence>

export prototype PurgeCache(HWND);  

function PurgeCache(hMSI)

    number nResult; 
    string szInstallMode;           
    string szCacheRoot;
        string szDir;
        string szPackageCode;
    LIST listDirs;   

begin

    szInstallMode = MsiGetCustomActionDataAttribute( hMSI, "/InstallMode=" );   
    szCacheRoot = MsiGetCustomActionDataAttribute( hMSI, "/CacheRoot=" );
    szPackageCode = MsiGetCustomActionDataAttribute( hMSI, "/PackageCode=" );

    listDirs = ListCreate (STRINGLIST);
    FindAllDirs( szCacheRoot, EXCLUDE_SUBDIR, listDirs );
    nResult = ListGetFirstString (listDirs, szDir);
    while (nResult != END_OF_LIST);  

        if ( szInstallMode = "Uninstall" || !( szDir % szPackageCode )) then
            DeleteDir( szDir, ALLCONTENTS );
        endif;
        nResult = ListGetNextString (listDirs, szDir);

    endwhile;

 return ERROR_SUCCESS;

end;

Давайте пройдемся по этому. Сначала мы должны ответить, где хранится код пакета. Коды пакетов описывают это в третьем абзаце: "Код пакета хранится в свойстве " Сводная информация о номере редакции " потока сводной информации ". Хорошо, так как мы это читаем? Это описано в разделе Использование потока сводной информации, где вы начинаете со вызова MsiGetSummaryInformation. Но этот код будет вызываться из пользовательского действия, поэтому давайте проверим, что все в порядке. Функции, не предназначенные для использования в пользовательских действиях, охватывают это. Сканируя список, мы не находим упоминания о функциях сводной информации (кроме MsiCreateTransformSummaryInfo, которая нам здесь не нужна).

Так что да, это возможно.

Другие вопросы по тегам