Понимание образца C ++ - принтеры, дескрипторы, строки - PullRequest
0 голосов
/ 13 июля 2011

Есть несколько вопросов из следующего кода, с которым я столкнулся здесь :

// 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? (см. Т)

Вопрос 3

  • Что здесь означает ноль?

Вопрос 4

  • Что означает RAW (что это за данные?) ?

Вопрос 5

  • Что обозначает 1 здесь?

Ответы [ 4 ]

8 голосов
/ 13 июля 2011
  1. &hPrinter - это адрес переменной hPrinter.Вам нужно передать его, чтобы функция OpenPrinter могла записать в нем фактический дескриптор принтера.

  2. _T берет строку символов и преобразует ее в соответствующий ANSI (8 бит)/ символ) или Unicode (16 бит / символ) представление на основе ваших настроек компиляции.По сути, это макрос, который либо расширяется до нуля (ANSI), либо L (Unicode) плюс фактическая строка.

  3. Здесь, где в коде?NULL - это макрос, который расширяется до (в основном) 0.Он используется для обеспечения достойного значения по умолчанию.

  4. Необработанные данные - это именно то, что звучит, необработанные данные.Это никак не структурировано, это просто набор байтов, которые вы передаете (обычно) устройству.

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

    Версияструктура, на которую указывает pDocInfo.Это значение должно быть 1.

6 голосов
/ 13 июля 2011
  1. &hPrinter - это адрес области памяти, занимаемой символом hPrinter. Например, если значение hPrinter было сохранено по адресу 0x1000 (маловероятно!), То четыре (или восемь или более; HANDLE определяется как PVOID, поэтому он будет варьироваться в зависимости от архитектуры), начиная с 0x1000 содержит значение 0 (NULL). Другими словами, хотя значение из hPrinter может быть НЕДЕЙСТВИТЕЛЬНО, оно по-прежнему имеет адрес и все еще занимает пространство памяти .

    Редактировать : Мой ответ, вероятно, не тот, что вы хотели. Второй параметр в OpenPrinter (которому вы передаете адрес hPrinter) на самом деле является выходным параметром, а не входным параметром. Это обычный обходной путь для того факта, что C ограничен одним возвращаемым значением, а большинство функций Win32 API возвращают значение состояния. Он получает дескриптор принтера после успешного завершения функции OpenPrinter.

  2. Макрос _T () определяет, настроен ли ваш проект на использование Юникода или нет, и соответствующим образом интерпретирует строковый литерал; см. объяснение MSDN .

  3. pOutputFile описывается здесь как:

    Указатель на завершающуюся нулем строку, которая определяет имя выходного файла. Для печати на принтере установите для этого параметра значение NULL.

    Другими словами: при печати на принтере, а не в файле, установите для этого параметра значение NULL. NULL обычно обозначает «нет значения» в контексте типов указателей.

  4. Лучше ответили другие.

  5. См. this для получения дополнительной информации, но в основном:

    Версия структуры, на которую указывает pDocInfo. Это значение должно быть 1.

    ... Так что я бы не стал сильно беспокоиться об этом на твоем месте. ;)

3 голосов
/ 13 июля 2011

когда я установил hPrinter = null, что означает & hPrinter?

Когда вы передаете & hPrinter, это означает, что вы передаете адрес дескриптора в API, так чтоapi выделит дескриптор и поместит его в hPrinter.

что означает (LPTSTR) _T?(см. T)

_T () - это макрос, который в сборке Unicode ставит L перед строковым литералом, чтобы сделать его широким, а в не-Unicode ничего не делает.

0 голосов
/ 13 июля 2011

hPrinter является опорным параметром, что означает, что функция может изменить фактический параметр, участвующий в вызове функции.Конечно, он (за занавесом) реализован в виде указателя, поэтому

    int j;
    int &i = j
    // realy is:
    int *i = &j;

берет адрес, помещая & infront из & i, чтобы оценить значение указателя «за занавесом».

_T ("hello world") - это определенный макросом компилятор, который может возвращать "hello world" в широком символьном формате в случае сборки в юникоде.Или в случае сборки ANSI: "Привет, мир" в char.

Чтобы ответить на остальные вопросы, обратитесь к документации или подождите, пока кто-нибудь ответит на ваши вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...