Создать новый дескриптор принтера для печати растрового файла
Я пишу библиотеку DLL в Visual C++, которая имеет функцию, в которой дескриптор принтера передается в качестве параметра. Этот дескриптор принтера (принтер HDC) используется для печати текстового файла. Теперь я хочу отправить еще одно задание на печать (файл растрового изображения) на тот же принтер.
Можем ли мы создать другой дубликат дескриптора существующего дескриптора "принтер", который я могу использовать для запуска нового задания печати.
Я попытался сделать это, создав новый дескриптор с помощью PRINTDLG/PRINTDLGEX, но я не смог добиться успеха
#include <windows.h>
#include "stdafx.h"
#include "ActPlugin.h" //My programs Header file
#include "stdlib.h"
#include <stdio.h>
#include <objidl.h>
#include "QRGenerator.h" // My program's header file
#include <gdiplus.h>
#include <GdiPlusGraphics.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
bool GetPrinterDC(HDC *Printer)
{
// Display the printer dialog box so the user can select the
// printer and the number of copies to print.
BOOL printDlgReturn = FALSE;
HDC printerDC = NULL;
PRINTDLG printDlgInfo = {0};
LPWSTR localPrinterName = NULL;
PDEVMODE returnedDevmode = NULL;
PDEVMODE localDevmode = NULL;
int localNumberOfCopies = 0;
// Initialize the print dialog box's data structure.
printDlgInfo.lStructSize = sizeof(printDlgInfo);
printDlgInfo.Flags =
// Return a printer device context.
PD_RETURNDC
// Don't allow selecting individual document pages to print.
// Remove this flag if you want to support this feature.
| PD_NOSELECTION;
// Display the printer dialog and retrieve the printer DC.
printDlgReturn = PrintDlg(&printDlgInfo);
// Check the return value.
if (TRUE == printDlgReturn)
{
// The user clicked OK so the printer dialog box data
// structure was returned with the user's selections.
// Copy the relevant data from the data structure and
// save them to a local data structure.
//
// Get the HDC of the selected printer
printerDC = printDlgInfo.hDC;
}
if (printerDC != NULL)
{
return false;
}
printer = &printerDC;
return true;
}
С вышеупомянутой функцией я получаю ниже erros
virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2065: 'PrintDlgEx' : undeclared identifier
1>c:\program files\actmask virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2146: syntax error : missing ';' before identifier 'printDlgInfo'
1>c:\program files\actmask virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2065: 'printDlgInfo' : undeclared identifier
Если я передаю мою новую задание на печать существующему дескриптору, новое задание на печать (изображение bmp) перекрывается с существующей печатью текстового файла. Поэтому я хочу создать новое задание на печать на том же принтере.
Я также проверил функцию "CreateDC", где нам нужно имя принтера или порт принтера. Я на самом деле хочу, чтобы моя программа была динамичной, то есть чтобы получить принтер во время выполнения. Моя DLL будет скопирована на несколько систем и должна иметь возможность автоматически обнаруживать принтер, подключенный к системе. Вот почему я пытаюсь создать новый дубликат дескриптора с существующим дескриптором.
Я буду очень признателен вам, если вы можете предоставить мне какие-либо материалы для решения этой проблемы. Я на самом деле новичок в работе с растровыми изображениями и принтерами.
Спасибо абхинай
РЕДАКТИРОВАТЬ
Как предложил Крейг после включения и перемещения "stdafx.h" в первую строку кода, я могу успешно скомпилировать и запустить программу. Теперь пользователь может выбрать принтер из командной строки.
Я создаю продукт и не хочу, чтобы мой пользователь дважды выбирал принтер для одной и той же задачи. Может кто-нибудь, дайте мне знать, если я могу создать новую ручку для принтера с существующей ручкой.
Заранее спасибо.