- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用基本的 MSI 设置。
我试图让光盘提示“请插入下一张光盘”,然后用户将继续插入下一张光盘,然后继续安装。
这是我的设置:
我设法使用允许光盘跨越的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
我有三个自定义操作:
CalculateCompressedProdGUID() —— 放置在执行序列中 ISSetupFilesExtract 之后。这会计算加密的 ID 并将其保存在属性中。这还会将旧的 MediaPackagePath 保存在属性中以供回滚之用。将操作放在这里无疑是有效的,因为它发生在 ResolveSource() 之前。
ResetMediaPackagePath() -- 在执行序列中放置在 SetCompressedProdGUID() 之后,因为它需要加密的 ID。
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/
我对汉诺塔的递归解决方案感到困惑,它在每次递归调用时减少 disc 参数,而不从 disc 的初始值开始,也不会在之后结束递归光盘通话次数。 在 disc 次调用之后,disc - 1 不应该达到值
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 5 年前。 Improve
tag
这看起来应该简单得离谱,但我很难弄明白。 我想复制 函数使光盘图像显示在左侧,但应用于 标记 我有这个,但它不显示光盘镜像。 .list { margin-top: 15px; m
以下代码将 PDF 文件流式传输到浏览器,但是我想将其保存到磁盘 (c:\myfile.pdf)... Dim FilePath As String = Server.MapPath("/docs/t
我正在使用基本的 MSI 设置。 我试图让光盘提示“请插入下一张光盘”,然后用户将继续插入下一张光盘,然后继续安装。 这是我的设置: DVD1:安装 DVD2:媒体内容 1(包含要复制到同一文件夹的内
以下代码将 PDF 文件流式传输到浏览器,但是我想将其保存到磁盘 (c:\myfile.pdf)... Dim FilePath As String = Server.MapPath("/docs/t
我可能对此视而不见。但是,我正在开发一个 DiscordJS 机器人 - 它有一个积分系统,可以使用 !give 将积分从用户 A 传递给用户 B。 通过点本身很好,所以这不是这里的重点。 问题是,如
我想用一个 div 创建一个半圆形。 这是我尝试过的。 div { width: 100px; height: 50px; background: gray; border-top-r
我已将 li 元素的填充设置为 0,但仍有大约 10 个像素的填充值。如何缩短提供的填充量? 最佳答案 不想无聊 :) 但在我看来否定声明 text-intend:-5px; 是一种错误的把戏。我知道
FindFirstFile 函数导致“驱动器中没有光盘。请将光盘插入驱动器”错误。此错误的原因是 U 盘中没有 sd 卡并且它是空的。我的问题是我必须扫描特定目录的所有驱动器,我无法区分驱动器是否为空
我应用了 css -webkit-text-security: disc;将单词屏蔽为密码,但它在 Internet Explorer 中不起作用。 这是我的代码: .hide{ -webkit-te
我的 li 正在显示:list-item;自动从浏览器并在前面有光盘,我尝试了 list-style-type:none;但它不起作用,唯一起作用的是显示:内联;然后光盘消失了,但它弄乱了他们所有的位
我正在尝试在 FlowDocument 中显示 View 列表。我意识到在使用时MarkerStyle = TextMarkerStyle.Disc,列表比其他列表缩进更少。我正在寻找一种方法来显示带
我遇到了与 user2320456 两天前遇到的相同错误。他们确实设法解决了他们的问题,并且由于问题过于局部化而关闭了问题。但我确实想知道 (a) 他们是如何解决的,或者 (b) 这是否是 Apple
是否有可能在 OSX(DiskUtil 或类似的东西)上创建一个加密的磁盘镜像,它会在将文件写入镜像时自动调整大小? 我问是因为“创建图像”对话框不显示任何选项,而仅适用于固定大小的图像。 最佳答案
我对Android平台不同的数据存储加密机制有点困惑。据我了解: 全盘加密影响整个/data 磁盘并且只能是由用户激活/停用。 ( https://source.android.com/securit
我制作了一个 JSR 168 portlet,如下所示: public class GetTest extends GenericPortlet { @Override public
所以我希望背景在我的图标上完全透明,所以我有代码: Menu 但是当我添加 ui-nodisc-icon 类时,我的图标周围出现了一个奇怪的灰色圆圈: 知道是什么原因造成的吗?如何解决? 最佳答案 对
我们的许多应用程序与队列管理器建立了不正确的连接 (SVRCONN),并且在不需要连接时没有发出 MQDISC,我们遇到了一个主要问题。这会导致大量空闲陈旧连接并阻止应用程序建立新连接并失败并出现 C
我很想知道是否可以分配可用磁盘空间仅用于在 iOS 应用程序中读取。这个问题的背景是安全问题。 假设您有一个在沙箱中运行的应用程序 A,该应用程序将用户文档存储在其应用程序私有(private)文件夹
我是一名优秀的程序员,十分优秀!