Замумукался я с этими принтерами (помогите!)
От: Antic  
Дата: 22.10.01 18:26
Оценка:
Как сказано в клевом MSDN
Чтобы получить дефолтовый принетр под 95-98 надо:

BOOL bFlag;
PRINTER_INFO_2 *ppi2 = NULL;
DWORD dwNeeded = 0;
DWORD dwReturned = 0;
HDC PrinterDC;


char pPrinterName [50];
char pDriverName[50];
char temp[50];

EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, 0, NULL, &dwNeeded, &dwReturned);
if (dwNeeded == 0)

// типа нэту принтеров
//return FALSE;


ppi2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwNeeded);

bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, dwNeeded, &dwNeeded, &dwReturned);

if (!bFlag)
{
LocalFree (LocalHandle (ppi2));
return FALSE;
}



// создаем контектс устройства принтера
PrinterDC = CreateDC ((LPCTSTR)ppi2->pDriverName, (LPCTSTR)ppi2->pPrinterName , NULL, NULL);
У меня этот кусок не работает нифига, при вызове второго EnumPrinters ошибка в winspool.drv

Чтобы получить дефолотовый принтер под NT:


if (GetProfileString("windows", "device", ",,,", cBuffer, MAXBUFFERSIZE) <= 0)
return FALSE;

// Printer name precedes first "," character...
char *token;
ZeroMemory(pPrinterName, sizeof(char)*50);
ZeroMemory(pDriverName, sizeof(char)*50);

token = strstr(cBuffer, ",");

strncpy(pPrinterName, cBuffer, strlen(cBuffer) — strlen(token));

token++;
strcpy(temp, token);
token = strstr(temp, ",");
strncpy(pDriverName, temp, strlen(temp) — strlen (token));



PrinterDC = CreateDC ( (LPCTSTR) pDriverName, (LPCTSTR) pPrinterName , NULL, NULL);

Все ништяк работает и под 98 и под NT

так вот собтвенно вопрос люди добрые, мне надо сделать универсальную программу 95-98-NT, есть ли особая разница при использовании
GetProfileString под NT и под 95-98 -й?
Re: Замумукался я с этими принтерами (помогите!)
От: Lom  
Дата: 23.10.01 05:04
Оценка:
Здравствуйте Antic, Вы писали:

A>Как сказано в клевом MSDN

A>Чтобы получить дефолтовый принетр под 95-98 надо:
A>
A> BOOL bFlag;
A> PRINTER_INFO_2 *ppi2 = NULL;
A> DWORD dwNeeded = 0;
A> DWORD dwReturned = 0;
A> HDC PrinterDC;


A> char pPrinterName [50];

A> char pDriverName[50];
A> char temp[50];
A>
A>EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, 0, NULL, &dwNeeded, &dwReturned);
A> if (dwNeeded == 0)
A>
A> // типа нэту принтеров
A> //return FALSE;
A>
A>
A> ppi2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwNeeded);

A> bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, dwNeeded, &dwNeeded, &dwReturned);


Ошибка 1. Надо писать:
HLOCALC mem=LocalAlloc (LPTR, dwNeeded);
ppi2=(LPPRINTER_INFO_2) LocalLock(mem)
... вызов EnumPrinters и всего где нужно ppi2
LocalUnlock(mem);
LocalFree(mem);


A> if (!bFlag)

A> {
A> LocalFree (LocalHandle (ppi2));
A> return FALSE;
A> }
A>
A>

A> // создаем контектс устройства принтера

A> PrinterDC = CreateDC ((LPCTSTR)ppi2->pDriverName, (LPCTSTR)ppi2->pPrinterName , NULL, NULL);
A>У меня этот кусок не работает нифига, при вызове второго EnumPrinters ошибка в winspool.drv

Ошибка 2. Надо делать вызов так
PrinterDC = CreateDC (NULL, (LPCTSTR)ppi2->pPrinterName , NULL, NULL);
Читай хелп. Работает и в 95-98 и в NT

A>Чтобы получить дефолотовый принтер под NT:

A> if (GetProfileString("windows", "device", ",,,", cBuffer, MAXBUFFERSIZE) <= 0)
A> return FALSE;
A>
A> // Printer name precedes first "," character...
A> char *token;
A> ZeroMemory(pPrinterName, sizeof(char)*50);
A> ZeroMemory(pDriverName, sizeof(char)*50);

A> token = strstr(cBuffer, ",");

A>
A> strncpy(pPrinterName, cBuffer, strlen(cBuffer) — strlen(token));
A>
A> token++;
A> strcpy(temp, token);
A> token = strstr(temp, ",");
A> strncpy(pDriverName, temp, strlen(temp) — strlen (token));
A>

A>

A> PrinterDC = CreateDC ( (LPCTSTR) pDriverName, (LPCTSTR) pPrinterName , NULL, NULL);
A>
A>Все ништяк работает и под 98 и под NT

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

A>GetProfileString под NT и под 95-98 -й?


Насчет разницы — не знаю. Лучше делать комбинированный вызов вариант 1, а если не удалось — то вариант 2
Re: Замумукался я с этими принтерами (помогите!)
От: VVV Россия  
Дата: 23.10.01 10:07
Оценка:
Здравствуйте Antic, Вы писали:

A>Как сказано в клевом MSDN

A>Чтобы получить дефолтовый принетр под 95-98 надо:
A>
A> BOOL bFlag;
A> PRINTER_INFO_2 *ppi2 = NULL;
A> DWORD dwNeeded = 0;
A> DWORD dwReturned = 0;
A> HDC PrinterDC;


A> char pPrinterName [50];

A> char pDriverName[50];
A> char temp[50];
A>
A>EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, 0, NULL, &dwNeeded, &dwReturned);
A> if (dwNeeded == 0)
A>
A> // типа нэту принтеров
A> //return FALSE;
A>
A>
A> ppi2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwNeeded);

A> bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, dwNeeded, &dwNeeded, &dwReturned);


A> if (!bFlag)

A> {
A> LocalFree (LocalHandle (ppi2));
A> return FALSE;
A> }
A>
A>

A> // создаем контектс устройства принтера

A> PrinterDC = CreateDC ((LPCTSTR)ppi2->pDriverName, (LPCTSTR)ppi2->pPrinterName , NULL, NULL);
A>У меня этот кусок не работает нифига, при вызове второго EnumPrinters ошибка в winspool.drv

A>Чтобы получить дефолотовый принтер под NT:



A> if (GetProfileString("windows", "device", ",,,", cBuffer, MAXBUFFERSIZE) <= 0)

A> return FALSE;
A>
A> // Printer name precedes first "," character...
A> char *token;
A> ZeroMemory(pPrinterName, sizeof(char)*50);
A> ZeroMemory(pDriverName, sizeof(char)*50);

A> token = strstr(cBuffer, ",");

A>
A> strncpy(pPrinterName, cBuffer, strlen(cBuffer) — strlen(token));
A>
A> token++;
A> strcpy(temp, token);
A> token = strstr(temp, ",");
A> strncpy(pDriverName, temp, strlen(temp) — strlen (token));
A>

A>

A> PrinterDC = CreateDC ( (LPCTSTR) pDriverName, (LPCTSTR) pPrinterName , NULL, NULL);
A>
A>Все ништяк работает и под 98 и под NT

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

A>GetProfileString под NT и под 95-98 -й?

посмотри функцию PageSetupDlg

    PAGESETUPDLG psd;

    memset(&psd, 0, sizeof(psd));
    psd.lStructSize=sizeof(psd);
    psd.Flags=PSD_RETURNDEFAULT|PSD_MARGINS|PSD_MINMARGINS|0;
    psd.hwndOwner=hWnd;

    if(!::PageSetupDlg(&psd))
      goto cleanup;
Re[2]: Замумукался я с этими принтерами (помогите!)
От: Antic  
Дата: 23.10.01 14:09
Оценка:
Здравствуйте 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);

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



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


проблема в том, что при использовании одного из вариантов вызова и операционки все может вылететь, что я уже наблюдаю второй день под NT и 98 :)
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...
Пока на собственное сообщение не было ответов, его можно удалить.