Re[3]: Замумукался я с этими принтерами (помогите!)
От: Lom  
Дата: 24.10.01 03:33
Оценка:
Здравствуйте Antic, Вы писали:

A>Здравствуйте Lom, Вы писали:


Lom>>Ошибка 1. Надо писать:

Lom>>HLOCALC mem=LocalAlloc (LPTR, dwNeeded);
Lom>>ppi2=(LPPRINTER_INFO_2) LocalLock(mem)
Lom>>... вызов EnumPrinters и всего где нужно ppi2
Lom>>LocalUnlock(mem);
Lom>>LocalFree(mem);

A>Ну извините, я из MSDNновских примеров брал кусок кода. :)




Lom>>Насчет разницы — не знаю. Лучше делать комбинированный вызов вариант 1, а если не удалось — то вариант 2


A>проблема в том, что при использовании одного из вариантов вызова и операционки все может вылететь, что я уже наблюдаю второй день под NT и 98 :)


Привожу кусок рабочей программы определения дефолтового принтера. Работает в WinMe и 2000. Жалоб на другие системы не поступало.

BYTE *buffer=NULL;
DWORD need;
int i;
char defPName[MAX_PATH];
DWORD pCnt;

if((!EnumPrinters(PRINTER_ENUM_DEFAULT|PRINTER_ENUM_CONNECTIONS,NULL,5,(LPBYTE)&buf,1,&need,&pCnt)) &&
(GetLastError()!=ERROR_INSUFFICIENT_BUFFER)){
defPName="";
}
else{
buffer=new BYTE[need];
ZeroMemory(buffer,need);
EnumPrinters(PRINTER_ENUM_DEFAULT|PRINTER_ENUM_CONNECTIONS,NULL,5,buffer,need,&need,&pCnt);
if(pCnt>0){
PRINTER_INFO_5 *ppi5=(PRINTER_INFO_5 *)buffer;
lstrcpy(defPName,ppi5->pPrinterName);
}
else{
char device[80];
ZeroMemory(device,80);
GetProfileString("windows","device","",device,79);
if(device[0]!=0){
lstrcpy(defPName,device);
char *point=strchr(defPName,',');
if(point) *point='\0';
pCnt=1;
}
}
if(buffer){
delete[] buffer;
buffer=NULL;
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.