Виртуальный Принтер для C++, C#, VB.NET, Delphi, VB (Visual Basic)
Sample Client Application
Sample Client Application используется для тестирования возможностей виртуального принтера и в целях разработки клиентских приложений. Это приложение отображает содержимое INI файла. Виртуальный принтер создает INI-файл с информацией о распечатанном документе и путями сгенерированных файлов. Вы можете просмотреть сгенерированные файлы двойным щечком мыши по строке, содержащей путь к файлу.

Вы можете открыть диалог "Свойства" для Виртуального принтера, нажав кнопку "Настройки Принтера".

Что Вам необходимо сделать, чтобы создать Sample Client Application на C++/MFC:
Считать из реестра режим передачи пути к INI файлу от виртуального принтера к заданному клиентскому приложению.
Этот параметр хранится в реестре в ветке "HKEY_LOCAL_MACHINE\SOFTWARE\Your Virtual Printer Example", ключ - "Transfer Mode". В C++/MFC значение этого параметра можно получить следующим образом:
// Get transfer mode related settings from the printer configuration
HKEY hKey = NULL;
DWORD dwSize = 0;
CString sKeyName;
CString sRegistryKey = "Your Virtual Printer Example";
sKeyName.Format("Software\\%s", sRegistryKey);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
RegQueryValueEx(hKey, "Transfer Mode", NULL, NULL, (BYTE*) &m_iTransferMode, &(dwSize = sizeof(int)));
RegCloseKey(hKey);
}
Получить путь к INI файлу. Способы получения получения этого пути в зависят от "Transfer Mode":
Transfer Mode = Command line. Передача с помощью командной строки. Виртуальный принтер запустит указанную ему программу с путем INI-файла в виде параметра командной строки. Для этого метода мы рекомендуем использовать такой способ получения содержимого ком.строки:
CString sInputIniFilePath = AfxGetApp()->m_lpCmdLine;
Transfer Mode = WM_COPYDATA. Режим передачи WM_COPYDATA. Принтер запускает указанную программу (или ищет уже запущенный экземпляр), и посылает ей путь INI-файла посредством сообщения WM_COPYDATA.
// If message ID is equal to ID from the COPYDATASTRUCT then the message is received from the EMF printer int iMessageID; RegQueryValueEx(hKey, "Message ID", NULL, NULL, (BYTE*) &iMessageID, &(dwSize = sizeof(int))); if (iMessageID == (int) pCopyDataStruct->dwData) { // Get the file name from the message data CString sInputIniFilePath = (char*) pCopyDataStruct->lpData; }Transfer Mode = Clipboard transfer mode. Режим передачи через буфер обмена. (Это устаревший метод, предназначен для старых программ). Принтер запускает указанную программу (или ищет уже запущенный экземпляр), размещает путь INI-файла в буфере обмена, и отправляет программе нотификацию.
// Analyze all messages from WM_APP range, check if the message has been //received from the EMF printer CString sClipboardFormat; if ((uMsg >= WM_APP) && (uMsg <= 0xBFFF) && ((int) uMsg == m_iMessageID)) { RegQueryValueEx(hKey, "Clipboard Format", NULL, NULL, (BYTE*) sClipboardFormat.GetBuffer(256), &(dwSize = 256)); sClipboardFormat.ReleaseBuffer(); // Register clipboard format UINT uClpFmt = RegisterClipboardFormat(sClipboardFormat); // Open the clipboard if (OpenClipboard()) { // Read data from the clipboard HANDLE h; if (h = GetClipboardData(uClpFmt)) { CString sInputIniFilePath = (char*) GlobalLock(h); GlobalUnlock(h); CloseClipboard(); } } }
Распарсить INI файл для получения информации о печати и путей для сгенерированных принтером файлов. В C++/MFC это можно сделать следующим образом:
char szBuf[512] = {0};
CString sTemp;
// Show device name
GetPrivateProfileString("Device", "DeviceName", NULL, szBuf, sizeof(szBuf), sInputIniFilePath);
// Show print job (document) page count
GetPrivateProfileString("Document", "Pages", NULL,szBuf, sizeof(szBuf), sInputIniFilePath);
iCount = GetPrivateProfileInt("EMF", "Count", 0, sInputIniFilePath);
for (j = 0; j < iCount; j++)
{
sTemp.Format("File%d", j);
GetPrivateProfileString("PDF", sTemp, NULL, szBuf, sizeof(szBuf), sInputIniFilePath);
}
Скачать Sample Client Application:
Виртуальный принтер для C++/MFC
Виртуальный принтер для Delphi
Виртуальный принтер для C#
Виртуальный принтер для VB.Net
Виртуальный принтер для VB6
Виртуальный принтер для нескольких языков