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

这是我几天来一直在努力解决的问题,现在束手无策。我正在使用 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() 函数

预期结果: 两个 hello world 提示,然后是常规 UI 屏幕以开始安装过程。

这是我目前的设置: 开发箱: - 明智的安装工作室 7.4.0.214 - 在 UAC 关闭的情况下运行的 Win7 x64,

测试箱: - Windows XP SP3 - Windows 安装程序 v4.5.6001.22159 - .Net Framework v4.0

这是我的测试用例:

  1. 具有 ascii 用户名的非管理员 - 'ALLUSERS=""' 和 ALLUSERS="1"的结果都符合预期
  2. 名称中包含 Unicode 字符的管理员“あくきえ”-“ALLUSERS=""' 和 ALLUSERS="1"的结果均符合预期
  3. 名称中包含 unicode 字符的非管理员“发涩”- 仅出现第一个提示,第二个提示显示错误,如下所示: “自定义操作出错。库 C:\Documents and Settings\??[LongAlphaNumericString].TMP\WiseCustomCalla.dll 无效或找不到。” 'ALLUSERS=""' 和 ALLUSERS="1"
  4. 都会发生这种情况
  5. 使用另一个管理员登录并将#3 中的用户设置为管理员,再次使用#3 中的用户登录,我们得到了预期的结果。

我试过强制使用短路径并将备用路径传递给用户数据文件夹,但没有任何效果。任何人都知道为什么会发生这种情况以及如何解决它? 我在这里包含了我用于此测试的所有文件,其中包括错误消息的屏幕截图、msi 和 msi.xml、wsi 文件、helloworld.dll(使用 rundll32 helloworld.dll、HellowWorld 进行测试)和上面每个测试用例的日志。

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

MSI/WSI 文件中需要更改哪些内容才能使#3 正确执行“从安装中调用自定义 DLL”操作?

谢谢, 亚伦P

最佳答案

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

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

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

https://stackoverflow.com/questions/4999011/

相关文章:

sql-server-2005 - SQL Server 2005 Unicode字符串排序问题

macos - 如何在 OS X 上从 gethostname() 获得一致的结果?

google-maps - 谷歌地图 API 最大坐标长度?

maven - 如何在 Maven 中将依赖类包含到 war 项目的 WEB-INF/classes

svn - .htaccess 文件中的 If 语句,仅在特定目录中启用密码保护

visual-studio-2010 - TFS Team Build MSTest 运行持续时间太

ruby-on-rails - rails : running code once after lo

c# - 如何在 C# 中从 IntPtr 获取 byte[]

c# - 从 Datagrid 插入和更新 SQL Server

php - soap 信封是如何生成的,为什么 .NET 和 php 客户端会生成/接收不同的 so