代码之家  ›  专栏  ›  技术社区  ›  Rob

使用MinGW构建ActiveQt(COM)应用程序

  •  3
  • Rob  · 技术社区  · 14 年前

    我正在使用qt4.6.3和Windows上的MinGW来构建Qt应用程序,现在需要为我的应用程序添加一个COM接口。我启用了ActiveQt,但由于缺少MIDL编译器的一个副本而出现了后期链接错误。我下载了一份最新的微软Windows SDK,其中包括MIDL,但现在MIDL抱怨它找不到cl.exe。我能得出的唯一结论是,您只能使用MS编译器构建ActiveQt应用程序,我宁愿避免使用MS编译器。这是一种让MinGW工作的方法还是我走运了?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Rob    14 年前

    使用微软的编译器和工具似乎是唯一可靠的方法让这项工作。

        2
  •  1
  •   rubenvb    14 年前

    1. 您确定在编译时链接了所有必需的库吗?如果你不显示准确的错误信息,我就帮不了你了。

    2. 这个 mingw-w32/w64 project

        3
  •  1
  •   Cristian Adam    14 年前

    你可以试试midl,widl的葡萄酒实现。看到酒了吗 wiki page 关于窗户上的建筑。

    如果你想让它快速运行,得到它 wine-prgs-0.9.14-mingw.zip

        4
  •  1
  •   mixmix    13 年前

    我同意Rob的第二篇文章:使用mingw构建ActiveX对象是一件非常糟糕的事情。Mingw在ActiveX方面有一些缺陷: https://bugzilla.mozilla.org/show_bug.cgi?id=203299 还有: https://qt.gitorious.org/qt/qt/merge_requests/2710

        5
  •  0
  •   ElDorado    7 年前

    我用另一种方法解决了这个问题:

    安装了QtCreator、Msys2和VS2015社区。

    使用批处理脚本启动Qt Creator:

    @echo off
    call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 8.1
    
    setlocal
    set MSYSTEM=MINGW32
    set MSYS2_PATH_TYPE=inherit
    start "" "C:\msys64\usr\bin\mintty" -i /msys2.ico -e /usr/bin/bash --login -c "/c/Qt/Tools/QtCreator/bin/qtcreator.exe"
    
    exit /b 0
    

    我将QtCreator推出Msys2环境,因为它提供了在我的项目中构建第三方所需的标准Unix工具。 所以在理论上这不是强制性的有Msys2为您。

    请注意: 不要使用WinSDK 10.0(或更高版本),因为它在PATH变量中没有midl.exe。

    这样做将创建PATH环境变量,其中Qt Creator处于最高优先级(因此您将使用Qt安装中的gcc)、Msys2 next(因此您可以使用标准Unix工具)以及MSVC和winsdk8.1(因此在构建时您将找到midl编译器)。

    现在我成功地构建了dll并将它从WinSDK传递到midl,但到目前为止,我仍在尝试在系统中注册它。

        6
  •  0
  •   M.M    4 年前

    这是根据 https://doc.qt.io/qt-5/activeqt-server.html

    安装的工具

    • qtcreator mingw64/mingw-w64 (64位目标),通过MSYS2安装。
    • 包裹 mingw64/mingw-w64-x86_64-qt5-static 已安装(这将启用qtcreator中的“Qt5 Static”工具包)。
    • Visual Studio 2019社区版(提供 midl.exe ).
    • https://github.com/lucasg/Dependencies -卢卡斯·沃克(不是必需的,但对检查静态构建(工作正常)有好处。

    创建COM DLL(还没有类型库)

    1. 从复制示例项目 qtactiveqt/examples/activeqt/simple . 实际上,我在QT的MSYS2安装中找不到这个,所以我直接克隆了QT源代码并选择了这个示例。
    2. 在QtCreator的Kit管理中,我选择了qt5静态64位Kit。这是为了避免由于在运行时找不到dll而导致的任何问题。
    3. 此示例是进程外服务器,因此要更改为进程内服务器,请添加到 simple.pro 归档行: TEMPLATE=lib CONFIG += dll .
    4. https://stackoverflow.com/a/64583309/1505939
    5. 构建项目。这将给出一个无法读取的警告 simple_res.o simpleax.dll ,但是还有一些错误消息要处理 widl 未找到--我们将在下一节中讨论。

    将类型库写入DLL

    其他Windows工具(例如。 regsvr32 ,以及任何其他希望使用DLL的客户端)希望能够从DLL中读取类型库。

    midl.exe文件

    在QtCreator中有一个应该调用midl的后期构建脚本。然而,这在QtCreator的MSYS2风格中不起作用。似乎它只是用MSVC作为工具为本地风味编写的。

    因此,我们必须手动进行后处理,包括:

    • simpleax.dll .
    • 运行此命令: idc simpleax.dll -idl simpleax.idl -version 1.0
    • simpleax.dll
    • midl simpleax.idl /nologo /tlb simpleax.tlb . (注意-只是添加 midl
    • 回到MSYS2的外壳里,走 idc simpleax.dll -tlb simpleax.tlb .

    请注意,仅当类型库发生更改时(即,对导出的COM对象的类定义进行更改),才需要执行所有这些操作。如果只是重建项目,那么只需要最后一步,您可能可以在QtCreator配置中添加为手动构建步骤。

    注册和运行测试

    祝贺 你!现在应该可以打开提升的命令提示符并运行 regsvr32 simpleax.dll 让它成功(如果不行,就跑 dependencies -chain simpleax.tlb

    注册成功后,我能够使用VS社区调用COM对象(新C++控制台项目),并且 #import "D:\path\to\simpleax.dll" ,然后创建 .tlh 包含DLL包装的C++头文件。

    清理类型库

    QObject 而不是 QWidget 作为基类。那么你就不会得到大多数与GUI元素有关的废话了。

    Q_CLASSINFO("EventsID", ... COM对象的类定义中的行意味着您没有在类型库中获得所有的源/接收器废话(出于某种原因,它决定必须将所有QT事件接收器放在其中)。

    .idl 调用之前的文件 米德尔 我们有一个干净的界面可以发布。

    进程外服务器

    app lib ). 通过连接类型库的过程 米德尔 是一样的。

    testobject.exe -regserver 没有消息告诉你它是成功还是失败,所以另一种方法是使用 idc -regserver testobject.exe

    我能够通过VS Community调用对象,这与进程内服务器相同。

    还有一些问题有待解决

    • 自动化生成后类型库过程。
    • 使非静态链接工作。
    • 自动删除类型库的废话(或报告错误)