обрезаетса имя принтера

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

06 авг 2008, 14:02

Привет
я пытаюсь вытащить имя принтера из Print Dialog используя следущий код

Код: Выделить всё

char  gs_selectedPrinter[200];
DEVNAMES *pdn;
DEVMODEA *pdm;
PRINTDLGA  printData;
ZeroMemory(&printData, sizeof(printData));
printData.lStructSize = sizeof(printData);
printData.hwndOwner = NULL;
printData.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;   
PrintDlg(&printData);

pdm = (DEVMODEA*)GlobalLock(printData.hDevMode);
if (!pdm)
{
	strcpy(gs_selectedPrinter, gpc_Class->getNotDef());
	return;
}
strcpy(gs_selectedPrinter, (const char*)pdm->dmDeviceName);
WriteToLog("Printer [%s].\n", pdm->dmDeviceName);
					
GlobalUnlock(printData.hDevMode); 
имя принтера SEGA -IT Dept - HP LaserJet P2015 Series PCL 5 но как результат получаю SEGA -IT Dept - HP LaserJet P. Подскажите как делать?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

07 авг 2008, 12:06

Здесь есть небольшая тонкость. Дело в том, что поле dmDeviceName объявлено в структуре DEVMODE как "unsigned char [32]" . К сожалению, это обозначает, что если имя принтера не влезет в этот буфер, то оно будет усечено, и ничего с этим не поделаешь.

Предлагаю небольшой хак. Дело в том, что есть такая Win32 API функция EnumPrinters. Она позволяет перечислить имена принтеров. В случае её использования, имена принтеров обрезаться не будут. Таким образом, получив урезанное имя выбранного в диалоге принтера, ты сможешь сопоставить его первые 31 символов поочередёно с каждым полным именем, полученным с помощью EnumPrinters. Первое совпадение даст тебе полное имя принтера.

Если не разберёшься с EnumPrinters, задавай вопросы - помогу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

07 авг 2008, 14:28

Spasibo. Pomoglo
Ответить