windows下Qt5.15调用Bartender打印报错

windows下Qt5.15调用Bartender打印报错

QAxObject btApp("BarTender.Application");
if (btApp.isNull()) {
setErr(err, "Cannot create COM object BarTender.Application (BarTender 2022 installed?)");
return false;
}

检查注册表

打开 regedit 搜索:

BarTender.Application
正常应该能在这些路径之一找到(取决于 32/64 位):找到:HKEY_CLASSES_ROOT\BarTender.Application

但是使用PowerShell:执行

New-Object -ComObject BarTender.Application报错:

PS C:\Users\wangchen> New-Object -ComObject BarTender.Application
New-Object : 检索 COM 类工厂中 CLSID 为 {B9425246-4131-11D2-BE48-004005A04EDF} 的组件失败,原因是出现以下错误: 80040154
没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。
所在位置 行:1 字符: 1
+ New-Object -ComObject BarTender.Application
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (:) [New-Object], COMException
+ FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

解决办法:

重新注册一下Bartender,使用管理员身份允许CMD

执行cd 安装目录;bartend.exe /Register后再次允许程序,运行成功。

导入模板,修改变量并打印流程:

const QString path = normalizePath(btwPath);
if (!QFileInfo::exists(path)) {
if (errorOut) *errorOut = "BTw not found: " + path;
return false;
}

QAxObject bt("BarTender.Application");
if (bt.isNull()) {
if (errorOut) *errorOut = "Failed to create BarTender.Application. Is BarTender 2022 installed?";
return false;
}
bt.setProperty("Visible", false);

QAxObject* formats = bt.querySubObject("Formats");
if (!formats) {
if (errorOut) *errorOut = "Failed to access BarTender.Application.Formats";
return false;
}

QAxObject* format = formats->querySubObject("Open(QString,bool,QString)", path, false, "");
if (!format) {
if (errorOut) *errorOut = "Failed to open format: " + path + " " + axLastError(formats);
return false;
}

if (!printerName.trimmed().isEmpty()) {
QAxObject* ps = format->querySubObject("PrintSetup");
if (!ps) {
if (errorOut) *errorOut = "Failed to access Format.PrintSetup";
format->dynamicCall("Close(bool)", false);
return false;
}
ps->setProperty("Printer", printerName.trimmed());
}

// Prefer NamedSubStrings (most common for variable placeholders).
bool anySet = false;
if (QAxObject* nss = format->querySubObject("NamedSubStrings")) {
for (auto it = namedValues.begin(); it != namedValues.end(); ++it) {
QAxObject* item = nss->querySubObject("Item(QString)", it.key());
if (item) {
format->dynamicCall("SetNamedSubStringValue(char *,char *)", it.key().toStdString().c_str(),it.value().toStdString().c_str());
anySet = true;
}
}
}

 参考:https://blog.csdn.net/weixin_42904603/article/details/141169788?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-2-141169788-blog-117475261.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-2-141169788-blog-117475261.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=5

 

 

posted @ 2026-02-11 14:36  一夜求风  阅读(28)  评论(0)    收藏  举报