无法使用自定义操作将MSI安装到具有用户名中的非ascii字符的非管理员

时间:2011-02-15 01:02:45

标签: unicode windows-installer custom-action non-admin

这是我几天来一直在努力解决的一个问题,现在我的智慧结束了。我正在使用Wise Installation Studio创建一个MSI,但我敢打赌它可以用任何MSI创作程序重新编写。我为那些希望使用我发布的MSI,DLL或WSI文件进行重新编写的人创建了一个测试样本。

  1. 创建一个新的明智的解决方案,保存为'test.wsi'并创建'test.msi'
  2. 对此文件不执行任何操作,只是在“UI序列”中的MigrateFeaturesState操作之后添加两个自定义操作
  3. 第一个自定义操作是“从安装中调用DLL”,它不传递参数并忽略返回码
  4. 第二个自定义操作是“从安装调用自定义DLL”,它不传递参数并忽略返回码
  5. 两个动作都引用相同的DLL和相同的函数,helloworld.dll和HelloWorld()函数只显示一个'HelloWorld'消息框
  6. 预期成果: 两个hello world提示然后在常规UI屏幕上启动安装过程。

    这是我目前的设置: 开发箱: - Wise Installation Studio 7.4.0.214 - 关闭UAC运行Win7 x64,

    测试盒: - Windows XP SP3 - Windows Installer v4.5.6001.22159 - .Net Framework v4.0

    以下是我的测试用例:

    1. 非管理员使用ascii用户名 - 结果与“ALLUSERS =”“和ALLUSERS =”1“
    2. 一样正常
    3. 管理员名称为“あくぇえ”的unicode字符 - “ALLUSERS =”“和ALLUSERS =”1“
    4. 的结果如预期
    5. 非管理员名称为“发涩”的unicode字符 - 仅显示第一个提示,第二个提示错误如下: “自定义操作出错。库C:\ Documents and Settings \ ?? [LongAlphaNumericString] .TMP \ WiseCustomCalla.dll无效或无法找到。” “ALLUSERS =”“和ALLUSERS =”1“
    6. 都会发生这种情况
    7. 使用其他管理员登录并将#3中的用户设置为admin,再次使用#3用户登录,我们会得到预期的结果。
    8. 我已经尝试过强制短路径并传递到用户数据文件夹的备用路径,但没有任何作用。任何人都知道为什么会这样,以及如何解决它? 我在这里包含了我用于此测试的所有文件,其中包括错误消息的屏幕截图,msi和msi.xml,wsi文件,helloworld.dll(使用rundll32 helloworld.dll测试,HellowWorld)和上面每个测试用例的日志。

      http://dl.dropbox.com/u/1797288/error.zip

      MSI / WSI文件中需要更改哪些内容,以便#3能够正确处理“从安装中调用自定义DLL”操作?

      谢谢, 亚伦P

1 个答案:

答案 0 :(得分:0)

我认为问题是由这些DLL的处理方式引起的。安装中的DLL存储在二进制表中,并在安装期间自动提取。它是原生的,所以它按预期工作。

从安装中调用自定义DLL很可能在安装期间使用不正确的路径来解压缩DLL。它可能是非管理员用户无法访问的每台计算机位置。

尝试使用支持Unicode字符的代码页构建MSI(您可以设置MSI语言)。另外,尝试创建日志并发布实际的DLL路径。