我遇到的以下代码中几乎没有问题here:
// RawDataToPrinter - sends binary data directly to a printer
//
// szPrinterName: NULL-terminated string specifying printer name
// lpData: Pointer to raw data bytes
// dwCount Length of lpData in bytes
//
// Returns: TRUE for success, FALSE for failure.
//
BOOL RawDataToPrinter(LPTSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
BOOL bStatus = FALSE;
HANDLE hPrinter = NULL;
DOC_INFO_1 DocInfo;
DWORD dwJob = 0L;
DWORD dwBytesWritten = 0L;
// Open a handle to the printer.
bStatus = OpenPrinter( szPrinterName, &hPrinter, NULL ); // question 1
if (bStatus) {
// Fill in the structure with info about this "document."
DocInfo.pDocName = (LPTSTR)_T("My Document"); // question 2
DocInfo.pOutputFile = NULL; // question 3
DocInfo.pDatatype = (LPTSTR)_T("RAW"); // question 4
// Inform the spooler the document is beginning.
dwJob = StartDocPrinter( hPrinter, 1, (LPBYTE)&DocInfo ); // question 5
if (dwJob > 0) {
// Start a page.
bStatus = StartPagePrinter( hPrinter );
if (bStatus) {
// Send the data to the printer.
bStatus = WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten);
EndPagePrinter (hPrinter);
}
// Inform the spooler that the document is ending.
EndDocPrinter( hPrinter );
}
// Close the printer handle.
ClosePrinter( hPrinter );
}
// Check to see if correct number of bytes were written.
if (!bStatus || (dwBytesWritten != dwCount)) {
bStatus = FALSE;
} else {
bStatus = TRUE;
}
return bStatus;
}
请在评论中查找问题编号
问题1
hPrinter = null
然后&hPrinter
是什么意思?问题2
(LPTSTR)_T
表示什么? (见T) 问题3
问题4
RAW
是什么意思(它是什么类型的数据?)?问题5
1
在这里表示什么?答案 0 :(得分:8)
&hPrinter
是hPrinter
变量的地址。您需要传递它,以便OpenPrinter
函数可以在其中写入打印机的实际句柄。
_T
根据您的编译设置获取您的字符串并将其转换为正确的ANSI(8位/字符)或Unicode(16位/字符)表示。基本上它是一个宏,可以扩展为空(ANSI)或L
(Unicode)加上实际的字符串。
在这里,在代码中? NULL
是一个扩展为(基本上)0
的宏。它用于提供合适的默认值。
原始数据与原始数据完全相同。它不是以任何方式构建的,它只是传递给(通常)设备的一大块字节。
来自http://msdn.microsoft.com/en-us/library/dd145115(v=vs.85).aspx:
pDocInfo指向的结构版本。该值必须为1.
答案 1 :(得分:6)
&hPrinter
是符号hPrinter
占用的内存空间的地址。例如,如果hPrinter
的值存储在地址0x1000(不太可能!),则四个(或八个或更多; HANDLE定义为PVOID,因此它将在架构之间变化)字节开始于0x1000将包含值0(NULL)。换句话说,虽然hPrinter
的值可能为NULL,但它仍然具有地址,并且它仍然占用内存空间。
修改:我的答案可能不是你所追求的。 OpenPrinter
的第二个参数(传递hPrinter
的地址)实际上是输出参数,而不是输入参数。这是一个常见的解决方法,因为C限制为一个返回值,并且大多数Win32 API函数返回状态值。一旦OpenPrinter
功能成功完成,它就会收到打印机的句柄。
_T()宏确定您的项目是否配置为使用Unicode,并相应地解释字符串文字;见MSDN's explanation。
pOutputFile被描述为here:
指向以null结尾的字符串的指针,该字符串指定输出文件的名称。要打印到打印机,请将其设置为NULL。
换句话说:在打印到打印机而不是文件时,将其设置为NULL。 NULL通常在指针类型的上下文中表示“无值”。
其他人更好地回答。
有关详情,请参阅this,但基本上是:
pDocInfo指向的结构版本。该值必须为1.
...如果我是你,我也不会过分担心。 ;)
答案 2 :(得分:3)
当我设置hPrinter = null那么& hPrinter是什么意思?
当您传递& hPrinter时,它意味着您将句柄的地址传递给api,以便api将分配一个句柄并将其放在hPrinter中。
(LPTSTR)_T表示什么? (见T)
_T()是一个宏,在Unicode构建中,它们将L放在字符串文字之前以使其宽,而在非Unicode中则不执行任何操作。
答案 3 :(得分:-2)
hPrinter是一个引用参数,这意味着函数可以更改函数调用中涉及的实际参数。它当然(在窗帘后面)实现为指针,所以
int j;
int &i = j
// realy is:
int *i = &j;
通过放置&在我面前评估幕后'的价值。指针。
_T(" hello world")是一个编译器定义的宏,它可以返回" hello world"在宽字符格式中,在unicode构建的情况下。或者在ANSI构建的情况下:" hello world"在char的。
要回答其余问题,请查阅文档,或等待其他人回答您的问题。