【问题标题】:inno CreateOleObject unicodeinno CreateOleObject unicode
【发布时间】:2017-03-08 14:39:03
【问题描述】:

我有一个使用非 unicode 版本的 inno 暴露为 com 对象的工作 .net dll。它已经工作了很长时间,没有任何变化。我正在尝试转换为 inno 的 unicode 版本,但遇到了调用 CreateOleObject 现在抛出“参数不正确,ProgId:***”的问题

要重新创建此问题...

创建一个名为 samplecom 的 C# 项目,并在项目属性/程序集信息中将程序集标记为 COM-Visible

在默认的 Class1.cs 文件中使用以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace samplecom
{
    [ComVisible(true)]
    public class MyClass
    {
        [ComVisible(true)]
        public string MyMethod()
        {
            return "Hello from COM dll";
        }
    }
}

构建项目,然后以管理员身份从 DOS/命令提示符使用 RegAsm 注册 dll,注意:以下假设您与 dll 或 samplecom\bin\debug 文件夹位于同一目录中

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe samplecom.dll /tlb:samplecom.tlb /codebase

然后使用以下脚本测试使用非 unicode 和 unicode 版本的 inno

[Setup]
AppName=My Sample COM
AppVersion=1.0
DefaultDirName={pf}\samplecom

[Code]
Var
  comObject: Variant;

function NextButtonClick(CurPage: Integer): Boolean;
var
  hWnd: Integer;
begin
  if CurPage = wpWelcome then begin
    comObject := CreateOleObject('samplecom.MyClass');

    log(comObject.MyMethod());
  end;
  Result := True;
end;

这里是 inno 的 ansi 版本的输出

[15:50:23.779]   *** Setup started
[15:50:25.435]   Setup version: Inno Setup version 5.5.8 (a)
[15:50:25.437]   Original Setup EXE: C:\dev\innosandbox\Output\setup.exe
[15:50:25.439]   Setup command line: /SL5="$82622,56832,56832,C:\dev\innosandbox\Output\setup.exe" /SPAWNWND=$92602 /NOTIFYWND=$1A2580 /DEBUGWND=$5310D8 
[15:50:25.440]   Windows version: 10.0.14393  (NT platform: Yes)
[15:50:25.441]   64-bit Windows: Yes
[15:50:25.443]   Processor architecture: x64
[15:50:25.445]   User privileges: Administrative
[15:50:25.446]   64-bit install mode: No
[15:50:25.450]   Created temporary directory: C:\Users\Keith\AppData\Local\Temp\is-E13L9.tmp
[15:50:35.234]   Hello from COM dll

更新:2017 年 3 月 9 日

这是项目的链接以及 inno 脚本的副本。

https://www.dropbox.com/s/nxkwtgm086dtokv/InnoCom.zip?dl=0

我不确定它是否相关或不同的问题,但使用 vbscript/cscript 我可以使用 32 位 vbscript/cscript 加载 COM 对象,但使用 64 位 vbscript/cscript 加载失败

test.vbs 文件

Dim objXL
Set objXL = WScript.CreateObject("InnoCom.Inno")

【问题讨论】:

  • 我在帖子中添加了示例代码
  • 注意:regasm 必须以管理员身份运行
  • 你确定它可以在 Ansi 版本的 Inno Setup 中工作吗?我在 Ansi 和 Unicode 版本中都遇到了相同(相似)的错误。
  • 是的,我看到log命令的输出,你在ansi版本中遇到什么错误?

标签: inno-setup


【解决方案1】:

Inno Setup 的 v6.0.3(u) 帮助给出了答案。在 "Pascal Scripting: Using COM Automation objects" 下,“基于 IUnknown 的 COM”正上方的行显示为:

如果您使用 .NET COM 对象并加载它会失败,因为 Inno 安装程序 5.5.9 尝试在创建之前将此行放入脚本中 COM 对象:LoadDLL(ExpandConstant('{sys}\mscoree.dll'), ErrorCode); 并添加Integer 类型的变量ErrorCode

对我来说,它解决了上面提到的问题。

https://www.jrsoftware.org/ishelp/topic_scriptautomation.htm

【讨论】:

    【解决方案2】:

    从官方网站 (http://files.jrsoftware.org/is/5/) 试用 isetup-5.5.8-unicode.exe 版本。当我使用 CreateOleObject 时,我的 .net dll 在版本 5.5.8 上运行良好,但不适用于 5.5.9 及更高版本。另请参阅修订历史记录http://www.jrsoftware.org/files/is5.5-whatsnew.htm。也许您会为以后的版本找到解决方案。

    5.5.9 (2016-04-06)

  • 为了进一步帮助保护安装程序免受潜在的DLL preloading attacks 的影响,安装程序/卸载程序现在调用 SetDefaultDllDirectories(如果可用)以从 DLL 搜索顺序中删除应用程序目录。如果 SetDefaultDllDirectories 不可用或无法调用,它现在会额外预加载一组系统 DLL,这些 DLL 已知会被旧版本或未打补丁的 Windows 不安全地加载。
  • 更改默认行为OutputBaseFileName [Setup] 部分指令现在默认为 mysetup 而不是 setup。不建议将其设置回setup:所有名为“setup.exe”的可执行文件都由 Windows 应用程序兼容性填充以加载其他 DLL,例如 version.dll。这些 DLL 被 Windows 不安全地加载,并且可以被劫持。如果你仍然这样做,编译器会发出警告。
  • 添加了新的[Files] 部分标志:signsignonce。指示编译器在存储原始源文件之前对其进行数字签名。如果未设置 [Setup] 部分指令 SignTool,则忽略。 Inno Setup 自己的编译器文件现在也已签名。
  • [Setup] 部分指令 LZMADictionarySize 现在允许将 LZMA 字典大小从之前的最大值 256 MB 增加到 1 GB。使用前请查看Compression 主题中列出的内存要求!
  • 改进了[Files] 部分的“自动重试”功能:即使前面的 DeleteFile 成功,它现在也会在 MoveFile 失败时重试。此外,如果 MoveFile 一直失败,如果使用 restartreplace [Files] 部分标志而不是显示错误消息,它现在将注册要在重新启动时替换的文件。
  • AppVersion 指令的值现在不仅用于在可能的情况下设置卸载注册表项中的MajorVersionMinorVersion 值,还用于设置VersionMajor 和@ 987654345@ 新版本的 Windows 应用认证工具包所需的值。
  • Inno 设置预处理器 (ISPP) 更改:

  • 新增功能RemoveFileExt
  • 记录在案的预定义变量ISPPCC_INVOKED
  • 控制台模式编译器 (ISCC) 更改:添加了新的命令行参数 /J。可用于#include 附加文件。
  • Unicode Inno 设置:添加了官方亚美尼亚语翻译。
  • 小幅调整。
  • 【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多