如何解决Ruby调用自定义C++ DLL时的Qt版本检测错误?
Ruby调用自定义C++ DLL遇到Qt版本检测警告的解决办法
我之前试过用Ruby代码调用自己写的C++ DLL,代码是这样的:
require 'ffi' require 'Win32API' module Test extend FFI::Library ffi_lib 'C:\Users\MyLab\Desktop\TestApi\TestAPI' attach_function :getInformation, [] ,:string # import, export = "0", calltype = :stdcall # codeGen = Win32API.new("TestAPI", "getInformation", [], 'I').call() end puts Test.getInformation
结果运行后弹出了这个错误:
Qt: Untested Windows version 10.0 detected!
折腾了一阵终于搞明白问题所在,还有对应的修复方法,分享给你:
问题原因
这个警告根本不是Ruby或者FFI的锅,是你那个C++ DLL背后依赖的Qt库搞的鬼。旧版本的Qt(比如Qt 5.6及更早)在Windows 10刚推出的时候没做适配,它会把Win10识别成“未经过测试的系统版本”,所以就抛出这个警告了。
修复方案
1. 升级Qt版本(最彻底)
直接把编译DLL用的Qt升级到5.7及以上版本,这些版本已经正式支持Windows 10,重新编译DLL之后,这个警告就会消失。这是长远来看最好的解决办法。
2. 修改C++ DLL代码,禁用警告
如果暂时没法升级Qt,就在你的C++代码里加一行,在Qt初始化之前设置环境变量跳过版本检测:
#include <QCoreApplication> // 或者QApplication,看你用的是哪个 // 在初始化Qt之前设置 qputenv("QT_UNSUPPORTED_WINDOWS_VERSION", "1"); // 然后再初始化Qt QCoreApplication a(argc, argv); // ... 你的其他DLL逻辑
如果是动态链接库,就在DLL的入口函数里做这个操作就行。
3. 在Ruby代码里提前设置环境变量(临时 workaround)
要是没法修改DLL的代码,也可以在Ruby加载DLL之前先设置对应的环境变量,让Qt闭嘴:
修改后的Ruby代码如下:
require 'ffi' # 关键:在加载DLL之前设置环境变量 ENV['QT_UNSUPPORTED_WINDOWS_VERSION'] = '1' module Test extend FFI::Library # 路径里的反斜杠要转义,或者用正斜杠 ffi_lib 'C:\\Users\\MyLab\\Desktop\\TestApi\\TestAPI' # Windows下DLL常用stdcall调用约定,这里明确指定更稳妥 attach_function :getInformation, [], :string, calling_convention: :stdcall end puts Test.getInformation
另外提一句,你代码里注释掉的Win32API部分可以不用管,用FFI就足够了,而且记得明确指定调用约定,避免潜在的调用错误。
内容的提问来源于stack exchange,提问作者Greed Ruler
相关产品推荐
相关产品推荐

