cuốn sách gpt4 ai đã làm

c# - Lỗi máy in Windows GDI StartDocPrinter

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 13:14:29 25 4
mua khóa gpt4 Nike

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?

câu trả lời hay nhất

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ự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);
}

Về c++ - Lỗi máy in Windows GDI StartDocPrinter, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/38022965/

25 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress