gpt4 book ai didi

Installshield 出现提示 "Insert Disc 2"等

转载 作者:行者123 更新时间:2023-12-02 16:31:49 25 4
gpt4 key购买 nike

我正在使用基本的 MSI 设置。

我试图让光盘提示“请插入下一张光盘”,然后用户将继续插入下一张光盘,然后继续安装。

这是我的设置:

  1. DVD1:安装
  2. DVD2:媒体内容 1(包含要复制到同一文件夹的内容作为安装)
  3. DVD3:媒体内容 2

我设法使用允许光盘跨越的Installshield 向导。我将其设置为“手动”,并指定了文件应位于的位置。完成此过程后,我留下了三 (3) 个名为“DISC1”、“DISC2”和“DISC3”的文件夹。

我刻录了第一张光盘,希望一切都能正常工作,并且一旦它识别出有尝试复制的内容不在该光盘上,就会提示我..但是......它会抛出错误说找不到光盘上的内容(惊讶!)

我想知道到目前为止我做错了什么?大家有同样的问题吗?

谢谢

最佳答案

旧安装程序中的问题是,升级预计会在从一个安装程序到另一个安装程序的 CD 介质上的同一文件夹中找到您的安装程序。 (它还需要相同的 .MSI 文件名。)初始安装完成后,CD 文件夹将记录在 MediaPackage 注册表项中。当 upgrqade 安装程序查找该文件夹但没有找到它(因为它已更改)时,它会弹出“插入磁盘 1”对话框,以便您可以查找它。烦人。

不知道较新版本的 Windows Installer 是否已修复此问题,因为我们已将解决方法保留在安装程序中,并且必须将其取出才能再次进行真正的测试。

第一个解决方案是保持 CD 文件夹名称相同 - 建立坚如磐石的媒体要求。

如果这是不可能的(因为构建媒体的白痴总是忘记?或者媒体要求发生了变化),下一个解决方案是创建一个自定义操作,将 MediaPackagePath 文件夹条目更改为当前 CD文件夹并将其放在操作序列中足够早的位置,以便安装程序不会提示(在实际查找 MediaPackage 文件夹值之前)。并且,如果用户取消安装,则创建回滚自定义操作以恢复旧的 MediaPackage 值。

这并不简单,因为它还涉及使用加密产品 GUID。因此,您必须执行一个操作来从标准 ProductID 生成加密 ID。

// For XP/2000/NT MediaPackage is set in two places:
// 1. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\
// Products\<encrypted prod guid>\SourceList\Media
// MediaPackage
// 2. HKEY_CLASSES_ROOT\Installer\Products\
// <encrypted prod guid>\SourceList\Media
// MediaPackage

我有三个自定义操作:

  1. CalculateCompressedProdGUID() —— 放置在执行序列中 ISSetupFilesExtract 之后。这会计算加密的 ID 并将其保存在属性中。这还会将旧的 MediaPackagePath 保存在属性中以供回滚之用。将操作放在这里无疑是有效的,因为它发生在 ResolveSource() 之前。

  2. ResetMediaPackagePath() -- 在执行序列中放置在 SetCompressedProdGUID() 之后,因为它需要加密的 ID。

  3. RollbackMediaPackagePath() -- 如果用户取消安装,则重置旧的 MediaPackage 值。此操作必须在 InstallInitialize() 之后发生,因为它是回滚操作(仅在回滚期间起作用)。

自定义操作仅适用于次要升级,因为主要升级会自动删除所有注册并重做,因此没有问题。事实上,所有这些繁琐的操作只是为了节省在更改 CD 上产品文件夹名称时进行小升级的可能性。

代码可能看起来像刚刚复制到这里的垃圾(如果您认为需要改进,请改进它):

***************

function CalculateCompressedProdGUID(hMsi)
STRING svSubStr, svProductGUID;
STRING szCompressedGUID; // return value
NUMBER iCount, nBuffer;
begin

MsiGetProperty(ISMSI_HANDLE, "ProductCode", svProductGUID, nBuffer);

// character 0 of the GUID is {
szCompressedGUID = "";
// first group - reverse order
for iCount = 8 downto 1
StrSub(svSubStr, svProductGUID, iCount, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
endfor;
// second group - reverse order
// character 9 is -
for iCount = 13 downto 10
StrSub(svSubStr, svProductGUID, iCount, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
endfor;
// third group - reverse order
// character 14 is -
for iCount = 18 downto 15
StrSub(svSubStr, svProductGUID, iCount, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
endfor;
// fourth group - swap every other
// character 19 is -
for iCount = 20 to 23 step 2
StrSub(svSubStr, svProductGUID, iCount + 1, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
StrSub(svSubStr, svProductGUID, iCount, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
endfor;
// fifth group - swap every other
// character 24 is -
for iCount = 25 to 36 step 2
StrSub(svSubStr, svProductGUID, iCount + 1, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
StrSub(svSubStr, svProductGUID, iCount, 1);
szCompressedGUID = szCompressedGUID + svSubStr;
endfor;
// character 37 of the GUID is } - so ignore

MsiSetProperty(ISMSI_HANDLE, "COMPRESSED_PROD_GUID", szCompressedGUID);

return ERROR_SUCCESS;

end;


*******************

function SetMediaPackagePathRegistryEntry(hMsi)
STRING svDBMediaPackagePath, szCompressedGUID, szKey;
STRING svIsMinorUpgrade, svPathValue;
NUMBER nBuffer, nReturn, nvPathSize, nvType;
begin

// For XP/2000/NT MediaPackage is set in two places:
// 1. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\
// Products\<encrypted prod guid>\SourceList\Media
// MediaPackage
// 2. HKEY_CLASSES_ROOT\Installer\Products\
// <encrypted prod guid>\SourceList\Media
// MediaPackage

// precaution against using during non-Minor Upgrade
svIsMinorUpgrade = "0";
nBuffer = 1;
MsiGetProperty (ISMSI_HANDLE, "IS_MINOR_UPGRADE", svIsMinorUpgrade, nBuffer);
if (svIsMinorUpgrade != "1") then
return ERROR_SUCCESS;
endif;

nBuffer = 40;
MsiGetProperty(ISMSI_HANDLE, "COMPRESSED_PROD_GUID", szCompressedGUID, nBuffer);

svPathValue = "\\"; // default
// Save the value for rollback functionality:
if (RegDBGetKeyValueEx ( szKey, "MediaPackage", nvType, svPathValue, nvPathSize ) = 0) then
MsiSetProperty(ISMSI_HANDLE, "MEDIAPACKAGEPATHROLLBACK", svPathValue);
endif;

nBuffer = 130;
MsiGetProperty(ISMSI_HANDLE, "MEDIAPACKAGEPATH", svDBMediaPackagePath, nBuffer);


// This is the main location MediaPackage is stored on 2000/XP/NT
RegDBSetDefaultRoot(HKEY_CLASSES_ROOT);
szKey = "Installer\\Products\\";
szKey = szKey + szCompressedGUID + "\\SourceList\\Media";
RegDBSetKeyValueEx ( szKey, "MediaPackage", REGDB_STRING, svDBMediaPackagePath, -1 );
// This is the secondary location.
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey = "SOFTWARE\\Classes\\Installer\\Products\\";
szKey = szKey + szCompressedGUID + "\\SourceList\\Media";
RegDBSetKeyValueEx ( szKey, "MediaPackage", REGDB_STRING, svDBMediaPackagePath, -1 );

return ERROR_SUCCESS;

end;


*************************

function RollbackMediaPackagePathRegistryEntry(hMSI)
STRING svRollbackPackagePath, szCompressedGUID, szKey;
STRING svIsMinorUpgrade, svPathValue;
NUMBER nBuffer, nvPathSize, nReturn;
begin

// For XP/2000/NT MediaPackage is set in two places:
// 1. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\
// Products\<encrypted prod guid>\SourceList\Media
// MediaPackage
// 2. HKEY_CLASSES_ROOT\Installer\Products\
// <encrypted prod guid>\SourceList\Media
// MediaPackage

// Remember that we no longer support Windows 98.

nBuffer = 1;
svIsMinorUpgrade = "0";
MsiGetProperty (ISMSI_HANDLE, "IS_MINOR_UPGRADE", svIsMinorUpgrade, nBuffer);
// precaution against use during non-Minor Upgrade
if (svIsMinorUpgrade != "1") then
return ERROR_SUCCESS;
endif;

nBuffer = 40;
MsiGetProperty(ISMSI_HANDLE, "COMPRESSED_PROD_GUID", szCompressedGUID, nBuffer);

// Get the rollback path
nBuffer = 130;
MsiGetProperty (ISMSI_HANDLE, "MEDIAPACKAGEPATHROLLBACK", svRollbackPackagePath, nBuffer);

// Primary location
RegDBSetDefaultRoot(HKEY_CLASSES_ROOT);
szKey = "Installer\\Products\\" + szCompressedGUID + "\\SourceList\\Media";
RegDBSetKeyValueEx ( szKey, "MediaPackage", REGDB_STRING, svRollbackPackagePath, -1 );
// Secondary location
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey = "SOFTWARE\\Classes\\Installer\\Products\\" + szCompressedGUID + "\\SourceList\\Media";
RegDBSetKeyValueEx ( szKey, "MediaPackage", REGDB_STRING, svRollbackPackagePath, -1 );

return ERROR_SUCCESS;

end;

关于Installshield 出现提示 "Insert Disc 2"等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com