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

Unicode 无法将带有自定义操作的MSI安装到用户名中带有非ascii字符的非管理员,unicode,windows-installer,custom-action,non-admin,Unicode,Windows Installer,Custom Action,Non Admin,这是一个我已经与之斗争了几天的问题,现在我束手无策。我正在用Wise Installation Studio创建一个MSI,但我敢打赌它可以用任何MSI创作程序重新制作。我已经为那个些希望使用我发布的MSI、DLL或WSI文件重新编程的人创建了一个测试样本 创建一个新的wise解决方案,另存为“test.wsi”并创建“test.msi” 除了在“UI序列”中的MigrateFeaturesState操作之后添加两个自定义操作外,不对该文件执行任何操作 第一个自定义操作是“从安装调用DLL”,它

这是一个我已经与之斗争了几天的问题,现在我束手无策。我正在用Wise Installation Studio创建一个MSI,但我敢打赌它可以用任何MSI创作程序重新制作。我已经为那个些希望使用我发布的MSI、DLL或WSI文件重新编程的人创建了一个测试样本

  • 创建一个新的wise解决方案,另存为“test.wsi”并创建“test.msi”
  • 除了在“UI序列”中的MigrateFeaturesState操作之后添加两个自定义操作外,不对该文件执行任何操作
  • 第一个自定义操作是“从安装调用DLL”,它不传入任何参数并忽略返回代码
  • 第二个自定义操作是“从安装调用自定义DLL”,它不传入任何参数并忽略返回代码
  • 这两个操作都引用同一个DLL和同一个函数,即helloworld.DLL和helloworld()函数,该函数只显示一个“helloworld”消息框
  • 预期结果: 两个hello world提示,然后在常规UI屏幕上启动安装过程

    以下是我当前的设置: 开发箱: -Wise安装工作室7.4.0.214 -Win7 x64在UAC关闭的情况下运行

    测试箱: -WindowsXPSP3 -Windows Installer v4.5.6001.22159 -.Net Framework v4.0

    以下是我的测试用例:

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

    MSI/WSI文件中需要更改哪些内容,以便#3在“从安装调用自定义DLL”操作中正常工作

    谢谢,
    Aaron P

    我认为问题是由这些DLL的处理方式引起的。安装中的DLL存储在二进制表中,并在安装过程中自动提取。它是本地的,所以它可以正常工作

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


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

    我认为问题是由处理这些DLL的方式引起的。安装中的DLL存储在二进制表中,并在安装过程中自动提取。它是本地的,所以它可以正常工作

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


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

    MSI的代码页不太可能有帮助。这些操作的工作方式是帮助器操作(由Wise提供)提取dll,然后使用不同于Windows Installer约定的约定调用dll。不幸的是,该粘合dll似乎是由ANSI构建的,无法处理当前临时路径上的非ANSI字符。唯一可能的解决方案是将您的dll重新实现为与Windows Installer兼容的dll,这样就不需要粘合dll。您可能认为设置MSI的代码页可以解决此问题,但我们无法向客户提供此解决方案。我发现一个类似的解决方法是将“非unicode程序的语言”设置为用户名的语言,这样可以解决这个问题。这是一个很好的工作,但我想尝试更好的@MichaelU:是的,我感到很沮丧,我将不得不重写我所有的DLL。你对问题的描述与我所做的所有调查都一致。我想看看ne1是否有另一个选项b4我关闭此MSI的代码页不太可能有帮助。这些操作的工作方式是帮助器操作(由Wise提供)提取dll,然后使用不同于Windows Installer约定的约定调用dll。不幸的是,该粘合dll似乎是由ANSI构建的,无法处理当前临时路径上的非ANSI字符。唯一可能的解决方案是将您的dll重新实现为与Windows Installer兼容的dll,这样就不需要粘合dll。您可能认为设置MSI的代码页可以解决此问题,但我们无法向客户提供此解决方案。我发现一个类似的解决方法是将“非unicode程序的语言”设置为用户名的语言,这样可以解决这个问题。这是一个很好的工作,但我想尝试更好的@MichaelU:是的,我感到很沮丧,我将不得不重写我所有的DLL。你对问题的描述与我所做的所有调查都一致。我想看看ne1是否有另一个选项b4我关闭这个