初始化Dymo Labelwriter 450打印机时遇COM未注册错误求助
解决DYMO打印机初始化时的COM未注册(DYMO.DLS)及类型转换问题
初始化DYMO打印机时遇到**COM未注册(DYMO.DLS)**错误,同时代码中的类型转换尝试无效,相关代码如下:
//error here DYMO.Label.Framework.IPrinters printer = (DYMO.Label.Framework.IPrinters) Framework.GetPrinters().First(x => x.Name == LabelWriterCmb.Text); // error here var server = new LocalPrintServer(); PrintQueue queue450 = server.GetPrintQueue(LabelWriterCmb.Text, new string[0] { }); var isOutOfPaper450 = queue450.IsOutOfPaper; var isOffLine450 = queue450.IsOffline; var isPaperJam450 = queue450.IsPaperJammed; var requiresUser450 = queue450.NeedUserIntervention; var hasPaperProblem450 = queue450.HasPaperProblem; var isBusy450 = queue450.IsBusy; if (printer is ILabelWriterPrinter && !isOffLine) { ILabelWriterPrintParams printParams = null; ILabelWriterPrinter labelWriterPrinter = printer as ILabelWriterPrinter; if (labelWriterPrinter.IsTwinTurbo) { printParams = new LabelWriterPrintParams(); printParams.RollSelection = (RollSelection)Enum.Parse(typeof(RollSelection), TrayCmb.Text); } for (int aantalPrints1 = 1; aantalPrints1 <= aantal; aantalPrints1++) { _label.SetObjectText("Streepjescode", ObjectDataEdit.Text); _label.SetObjectText("Tekst1", string.Format("Login PC vestiging {0}", vestiging[locatie])); _label.SetObjectText("Product", Artikel); decimal verkoopPrijs = decimal.Parse(Verkoop); _label.SetObjectText("Tekst2", string.Format("Prijs € {0:N2}", verkoopPrijs)); //_label.Print(printer, printParams); queue = server.GetPrintQueue(LabelWriterCmb.Text, new string[0] { }); bool onLine = queue.IsPrinting; } }
解决方案
一、修复COM未注册问题
- 重新注册DYMO COM组件:
找到DYMO SDK安装目录下的DYMO.DLS.LabelWriter.8.dll(默认路径为C:\Program Files (x86)\DYMO\DYMO Label Software\SDK),以管理员身份打开命令提示符,执行:regsvr32 "C:\Program Files (x86)\DYMO\DYMO Label Software\SDK\DYMO.DLS.LabelWriter.8.dll" - 匹配DYMO Label Software版本:卸载现有DYMO Label软件,重新下载安装最新版本,SDK会随软件一同安装,避免版本不兼容导致注册失败。
- 检查平台兼容性:如果项目是64位,确保安装64位DYMO SDK;32位项目对应32位SDK,位数不匹配会直接导致COM注册失败。
二、修复代码类型转换错误
原代码中Framework.GetPrinters().First(...)返回单个IPrinter实例,而非IPrinters集合,导致类型转换错误,修正后代码如下:
// 修正类型:IPrinter 而非 IPrinters DYMO.Label.Framework.IPrinter printer = Framework.GetPrinters().First(x => x.Name == LabelWriterCmb.Text); var server = new LocalPrintServer(); PrintQueue queue450 = server.GetPrintQueue(LabelWriterCmb.Text, new string[0] { }); var isOutOfPaper450 = queue450.IsOutOfPaper; var isOffLine450 = queue450.IsOffline; var isPaperJam450 = queue450.IsPaperJammed; var requiresUser450 = queue450.NeedUserIntervention; var hasPaperProblem450 = queue450.HasPaperProblem; var isBusy450 = queue450.IsBusy; // 修正变量名:isOffLine450 而非 isOffLine if (printer is ILabelWriterPrinter && !isOffLine450) { ILabelWriterPrintParams printParams = null; ILabelWriterPrinter labelWriterPrinter = printer as ILabelWriterPrinter; if (labelWriterPrinter.IsTwinTurbo) { printParams = new LabelWriterPrintParams(); printParams.RollSelection = (RollSelection)Enum.Parse(typeof(RollSelection), TrayCmb.Text); } for (int aantalPrints1 = 1; aantalPrints1 <= aantal; aantalPrints1++) { _label.SetObjectText("Streepjescode", ObjectDataEdit.Text); _label.SetObjectText("Tekst1", string.Format("Login PC vestiging {0}", vestiging[locatie])); _label.SetObjectText("Product", Artikel); decimal verkoopPrijs = decimal.Parse(Verkoop); _label.SetObjectText("Tekst2", string.Format("Prijs € {0:N2}", verkoopPrijs)); // 恢复打印调用 _label.Print(printer, printParams); queue = server.GetPrintQueue(LabelWriterCmb.Text, new string[0] { }); bool onLine = queue.IsPrinting; } }
关键修正点:
- 将目标类型从
IPrinters改为IPrinter,匹配First()返回的单个打印机实例类型。 - 修正
if判断中的变量名错误,将isOffLine改为定义好的isOffLine450。 - 恢复注释掉的
_label.Print(printer, printParams);调用,确保打印逻辑正常执行。
内容的提问来源于stack exchange,提问作者rinaldo Visscher
相关产品推荐
相关产品推荐

