了解C ++示例 - 打印机,句柄,字符串

时间:2011-07-13 16:30:09

标签: c++ visual-c++ printing

我遇到的以下代码中几乎没有问题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

  • 这里的null表示什么?

问题4

  • RAW是什么意思(它是什么类型的数据?)

问题5

  • 1在这里表示什么?

4 个答案:

答案 0 :(得分:8)

  1. &hPrinterhPrinter变量的地址。您需要传递它,以便OpenPrinter函数可以在其中写入打印机的实际句柄。

  2. _T根据您的编译设置获取您的字符串并将其转换为正确的ANSI(8位/字符)或Unicode(16位/字符)表示。基本上它是一个宏,可以扩展为空(ANSI)或L(Unicode)加上实际的字符串。

  3. 在这里,在代码中? NULL是一个扩展为(基本上)0的宏。它用于提供合适的默认值。

  4. 原始数据与原始数据完全相同。它不是以任何方式构建的,它只是传递给(通常)设备的一大块字节。

  5. 来自http://msdn.microsoft.com/en-us/library/dd145115(v=vs.85).aspx

      

    pDocInfo指向的结构版本。该值必须为1.

答案 1 :(得分:6)

  1. &hPrinter是符号hPrinter占用的内存空间的地址。例如,如果hPrinter的值存储在地址0x1000(不太可能!),则四个(或八个或更多; HANDLE定义为PVOID,因此它将在架构之间变化)字节开始于0x1000将包含值0(NULL)。换句话说,虽然hPrinter可能为NULL,但它仍然具有地址,并且它仍然占用内存空间

    修改:我的答案可能不是你所追求的。 OpenPrinter的第二个参数(传递hPrinter的地址)实际上是输出参数,而不是输入参数。这是一个常见的解决方法,因为C限制为一个返回值,并且大多数Win32 API函数返回状态值。一旦OpenPrinter功能成功完成,它就会收到打印机的句柄。

  2. _T()宏确定您的项目是否配置为使用Unicode,并相应地解释字符串文字;见MSDN's explanation

  3. pOutputFile被描述为here

      

    指向以null结尾的字符串的指针,该字符串指定输出文件的名称。要打印到打印机,请将其设置为NULL。

    换句话说:在打印到打印机而不是文件时,将其设置为NULL。 NULL通常在指针类型的上下文中表示“无值”。

  4. 其他人更好地回答。

  5. 有关详情,请参阅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的。

要回答其余问题,请查阅文档,或等待其他人回答您的问题。