PRNFILE* lpt = prn_open(L"OKI MICROLINE XXXX");
prn_printf(lpt, "\x1b@"); // 初期化
prn_printf(lpt, "test"); // 印字
prn_printf(lpt, "\f"); // 改ページ
prn_close(lpt);
---------------------------------------------------------
#include <windows.h>
#include <cstdarg>
struct PRNFILE {
HANDLE hPrinter;
};
----------------------------------------------------------
PRNFILE* prn_open(const wchar_t* printerName)
{
PRNFILE* pf = new PRNFILE;
if (!OpenPrinterW*1 {
delete pf;
return nullptr;
}
DOC_INFO_1W docInfo;
docInfo.pDocName = (LPWSTR)L"Raw Print";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = (LPWSTR)L"RAW";
StartDocPrinterW(pf->hPrinter, 1, (LPBYTE)&docInfo);
StartPagePrinter(pf->hPrinter);
return pf;
}
-------------------------------------------------------
int prn_printf(PRNFILE* pf, const char* fmt, ...)
{
char buffer[1024];
va_list args;
va_start(args, fmt);
int len = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
if (len <= 0) return 0;
DWORD written;
WritePrinter(pf->hPrinter, buffer, len, &written);
return written;
}
-------------------------------------------------------
void prn_close(PRNFILE* pf)
{
if (!pf) return;
EndPagePrinter(pf->hPrinter);
EndDocPrinter(pf->hPrinter);
ClosePrinter(pf->hPrinter);
delete pf;
}
------------------------------------------------------
| 旧DOSコード | 置換後 |
|---|---|
FILE* lpt |
PRNFILE* lpt |
fopen() |
prn_open() |
fprintf() |
prn_printf() |
fcloseall() |
prn_close() |
まとめ(重要)
*************************
完成版 prn_printf()(実務用)
#include <cstdarg>
#include <cstdio>
#include <windows.h>
int prn_printf(PRNFILE* pf, const char* fmt, ...)
{
if (!pf) return 0;
char buffer[2048]; // 帳票ならこれで十分
va_list args;
va_start(args, fmt);
int len = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
if (len <= 0) return 0;
if (len >= (int)sizeof(buffer)) {
// バッファ溢れ防止(切り捨て)
len = sizeof(buffer) - 1;
}
DWORD written = 0;
WritePrinter(pf->hPrinter, buffer, len, &written);
return written;
}
④ 実務例(帳票コードが完全にそのまま)
int value = 123;
prn_printf(lpt, "\x1b@");
prn_printf(lpt, "数量:%6d\n", value);
prn_printf(lpt, "金額:%6d 円\n", value * 10);
prn_printf(lpt, "\f");
注意点(ここだけは必ず守る)
⚠ ワイド文字は使わない
❌ ダメ
⭕ OK
ESC/Pは char(Shift-JIS)前提
⚠ 改行コード
| 文字 | 意味 |
|---|---|
\n |
行送り |
\r |
復帰 |
\r\n |
機種によりズレ |
*1:LPWSTR)printerName, &pf->hPrinter, NULL