Thực ra tôi đang sử dụng Qt để in và cần gửi lệnh RAW (lệnh ESCP) tới máy in. Sau khi thực hiện một số tìm kiếm, tôi thấy rằng mình cần sử dụng API Windows để thực hiện điều đó.
Xem chủ đề này:win32-c-print-string-to-máy in
Tôi đã tạo đoạn mã sau:
const QString pName = "EPSON LX-300+ /II";
LPBYTE lpData;
BOOL bTrạng thái = FALSE;
XỬ LÝ hPrinter = NULL;
DOC_INFO_1 Thông tin tài liệu;
DWORD dwPrtJob = 0L;
DWORD dwBytesWritten = 0L;
Tên máy in LPTSTR = wchar_t mới [pName.length() + 1];
pName.toWCharArray(tên máy in);
printName[pName.length()] = '\0';
QString so = "\x1b@Nó có hoạt động không?";
QByteArray ba = so.toUtf8();
lpData = (unsigned char*)(ba.data());
DWORD dwCount = ba.length();
qDebug() << vậy;
bStatus = OpenPrinter(tên máy in, &hPrinter, NULL);
nếu (bStatus) {
DocInfo.pDocName = (LPTSTR)_T("Tài liệu của tôi");
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = (LPTSTR)_T("RAW");
dwPrtJob = StartDocPrinter (
hMáy in,
1,
(LPBYTE)&DocInfo);
qDebug() << GetLastError();
nếu (dwPrtJob > 0) {
qDebug() << "LỆNH";
// Gửi dữ liệu tới máy in.
bStatus = Máy in ghi (
hMáy in,
lpData,
dwCount,
&dwBytesViết);
}
qDebug() << dwCount;
qDebug() << dwBytesWritten;
EndDocPrinter (hPrinter);
// Đóng tay cầm máy in.
bStatus = ClosePrinter(hPrinter);
qDebug() << bStatus;
}
if (!bStatus || (dwCount != dwBytesWritten)) {
bTình trạng = FALSE;
} khác {
bTình trạng = TRUE;
}
xóa tên máy in;
Mã trên StartDocPrinter bị lỗi, nó trả về 0, nghĩa là lỗi. Và sử dụng GetLastError(), hàm trả về 1804. và trích dẫn cái này , lỗi là ERROR_INVALID_DATATYPE. Tôi không chắc lỗi là gì. Tôi đã thử sử dụng DocInfo.pDatatype khác nhau cho "RAW", "TEXT" và "XPS_PASS", kết quả vẫn như nhau.
Có cách nào để giải quyết điều này?
DOC_INFO_1 Thông tin tài liệu;
DocInfo.pDocName = (LPTSTR)_T("Tài liệu của tôi");
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = (LPTSTR)_T("RAW");
Sự chuyển đổi này tóm lại thành
DocInfo.pDocName = (wchar_t*)L"Tài liệu của tôi";
...
pDocName
được khai báo là wchar_t*
Điều này là sai, việc chuyển đổi chỉ ẩn các lỗi và cảnh báo. Cố gắng tránh sử dụng Microsoft T
Macro đã lỗi thời và vô dụng. Vui lòng sử dụng C++ thay thế ký tự
Và wchar_t*
. Để khai báo chuỗi ký tự rộng UTF16 trong Windows, hãy sử dụng L
tiền tố. Cách sử dụng đúng như sau:
DOC_INFO_1 Thông tin tài liệu;
wchar_t docName[100], dataType[100];
wcscpy_s(docName, 100, L"Công việc in");
wcscpy_s(dataType, 100, L"RAW");
DocInfo.pDocName = docName;
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = dataType;
例子:
const QString pName = "EPSON LX-300+ /II";
wchar_t tên máy in[100];
pName.toWCharArray(tên máy in);
pName[pName.length()] = '\0';
XỬ LÝ máy in;
if (OpenPrinter(tên máy in, &hprinter, NULL))
{
DOC_INFO_1 Thông tin tài liệu;
wchar_t docName[100], dataType[100];
wcscpy_s(docName, 100, L"Công việc in");
wcscpy_s(dataType, 100, L"RAW");
DocInfo.pDocName = docName;
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = dataType;
DWORD printJob = StartDocPrinter(hprinter, 1, (LPBYTE)&DocInfo);
if (printJob && StartPagePrinter(hprinter))
{
MessageBox(0, L"StartPagePrinter OK", 0, 0);
DWORD được viết = 0;
int buflen = 100;
char *buf = char mới[buflen];
strcpy_s(buf, buflen, "123");
if (WritePrinter(hprinter, buf, 3, &writing))
MessageBox(0, L"OK", 0, 0);
xóa[]buf;
EndPagePrinter(hprinter);
EndDocPrinter(hprinter);
}
ClosePrinter(hprinter);
}
Tôi là một lập trình viên xuất sắc, rất giỏi!