Страница 1 из 1

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

Добавлено: 06 авг 2008, 14:02
michael
Привет
я пытаюсь вытащить имя принтера из 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. Подскажите как делать?

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

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

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

Если не разберёшься с EnumPrinters, задавай вопросы - помогу.

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

Добавлено: 07 авг 2008, 14:28
michael
Spasibo. Pomoglo