MySetPrinter(), Hilfe für Port C nach PB
Verfasst: 20.02.2013 16:31
Hallo!
Auf der deutschen MS-Seite ist eine Beispiel für die Anwendung von SetPrinter() aufgeführt:
http://support.microsoft.com/kb/140285/de
Diesen versuche ich nach PureBasic zu portieren, was aber nicht so recht gelingen will.
Hier zuerst der Code von der MSDN-Seite:
Und hier mein Versuch in PureBasic:
Der übersetzte Teil befindet sich in der Prozedur MySetPrinter().
Aktuell bereiten mir diese Zeilen Probleme:
Ich habe sie so übersetzt:
Die Fehlermeldung beim Kompilieren lautet:
Auf der deutschen MS-Seite ist eine Beispiel für die Anwendung von SetPrinter() aufgeführt:
http://support.microsoft.com/kb/140285/de
Diesen versuche ich nach PureBasic zu portieren, was aber nicht so recht gelingen will.
Hier zuerst der Code von der MSDN-Seite:
Code: Alles auswählen
// MySetPrinter
//
// Demonstrates how to use the SetPrinter API. This particular function changes the orienation
// for the printer specified in pPrinterName to the orientation specified in dmOrientation.
//
// Valid values for dmOrientation are:
// DMORIENT_PORTRAIT (1)
// or
// DMORIENT_LANDSCAPE (2)
BOOL MySetPrinter(LPTSTR pPrinterName, short dmOrientation)
{
HANDLE hPrinter = NULL;
DWORD dwNeeded = 0;
PRINTER_INFO_2 *pi2 = NULL;
DEVMODE *pDevMode = NULL;
PRINTER_DEFAULTS pd;
BOOL bFlag;
LONG lFlag;
// Open printer handle (on Windows NT, you need full-access because you
// will eventually use SetPrinter)...
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd);
if (!bFlag || (hPrinter == NULL))
return FALSE;
// The first GetPrinter tells you how big the buffer should be in
// order to hold all of PRINTER_INFO_2. Note that this should fail with
// ERROR_INSUFFICIENT_BUFFER. If GetPrinter fails for any other reason
// or dwNeeded isn't set for some reason, then there is a problem...
SetLastError(0);
bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
(dwNeeded == 0))
{
ClosePrinter(hPrinter);
return FALSE;
}
// Allocate enough space for PRINTER_INFO_2...
pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (pi2 == NULL)
{
ClosePrinter(hPrinter);
return FALSE;
}
// The second GetPrinter fills in all the current settings, so all you
// need to do is modify what you're interested in...
bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
if (!bFlag)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
// DocumentProperties...
if (pi2->pDevMode == NULL)
{
dwNeeded = DocumentProperties(NULL, hPrinter,
pPrinterName,
NULL, NULL, 0);
if (dwNeeded <= 0)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
if (pDevMode == NULL)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
lFlag = DocumentProperties(NULL, hPrinter,
pPrinterName,
pDevMode, NULL,
DM_OUT_BUFFER);
if (lFlag != IDOK || pDevMode == NULL)
{
GlobalFree(pDevMode);
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
pi2->pDevMode = pDevMode;
}
// Driver is reporting that it doesn't support this change...
if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
if (pDevMode)
GlobalFree(pDevMode);
return FALSE;
}
// Specify exactly what we are attempting to change...
pi2->pDevMode->dmFields = DM_ORIENTATION;
pi2->pDevMode->dmOrientation = dmOrientation;
// Do not attempt to set security descriptor...
pi2->pSecurityDescriptor = NULL;
// Make sure the driver-dependent part of devmode is updated...
lFlag = DocumentProperties(NULL, hPrinter,
pPrinterName,
pi2->pDevMode, pi2->pDevMode,
DM_IN_BUFFER | DM_OUT_BUFFER);
if (lFlag != IDOK)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
if (pDevMode)
GlobalFree(pDevMode);
return FALSE;
}
// Update printer information...
bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
if (!bFlag)
// The driver doesn't support, or it is unable to make the change...
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
if (pDevMode)
GlobalFree(pDevMode);
return FALSE;
}
// Tell other apps that there was a change...
SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
(LPARAM)(LPCSTR)pPrinterName,
SMTO_NORMAL, 1000, NULL);
// Clean up...
if (pi2)
GlobalFree(pi2);
if (hPrinter)
ClosePrinter(hPrinter);
if (pDevMode)
GlobalFree(pDevMode);
return TRUE;
}
Code: Alles auswählen
EnableExplicit
Procedure MySetPrinter(pPrinterName, dmOrientation)
Protected hPrinter
Protected dwNeeded
Global *pi2.PRINTER_INFO_2
Global *pDevMode.DEVMODE
Protected pd.PRINTER_DEFAULTS
Protected bFlag.i
Protected lFlag.i
pd\DesiredAccess = #PRINTER_ALL_ACCESS
bFlag = OpenPrinter_(pPrinterName, @hPrinter, pd)
If ( ~bFlag| (hPrinter=0))
Debug "Fehler: OpenPrinter_()"
ProcedureReturn #False
EndIf
SetLastError_(0)
bFlag=GetPrinter_(hPrinter, 2, 0, 0, @dwNeeded)
If (~bflag & (GetLastError_() <> #ERROR_INSUFFICIENT_BUFFER) | (dwNeeded=0))
ClosePrinter_(hPrinter)
Debug "Fehler GetPrinter_()"
ProcedureReturn -1;#False
EndIf
*pi2=AllocateMemory(dwNeeded)
If *pi2=0
ClosePrinter_(hPrinter)
Debug "Fehler AllocMemomry())"
ProcedureReturn -2;#False
EndIf
bFlag=GetPrinter_(hPrinter, 2, *pi2, dwNeeded, @dwNeeded)
Debug bflag
If bFlag=0
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
Debug "Fehler GetPrinter_()"
ProcedureReturn -3;#False
EndIf
If *pi2\pDevMode = 0
dwNeeded=DocumentProperties_(0, hPrinter, pPrinterName, 0, 0, 0)
If dwNeeded<=0
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
Debug "Fehler DocumentProperties_()"
ProcedureReturn -4;#False
EndIf
*pDevMode=AllocateMemory(dwNeeded)
If *pDevMode=0
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
Debug "Fehler AllocMemory()"
ProcedureReturn -5;#False
EndIf
lFlag=DocumentProperties_(0, hPrinter, pPrinterName, *pDevMode, 0, #DM_OUT_BUFFER)
If (lFlag<>#IDOK) | (*pDevMode=0)
FreeMemory(*pDevMode)
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
Debug "Fehler DocumentProperties_()"
ProcedureReturn -6;#False
EndIf
*pi2\pDevMode=*pDevMode
EndIf
If (~(*pi2\pDevMode\dmFields & #DM_ORIENTATION))
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
If *pDevMode
FreeMemory(*pDevMode)
EndIf
Debug "Fehler: Änderung nicht unterstützt."
ProcedureReturn -7,#False
EndIf
*pi2\pDevMode\dmFields = #DM_ORIENTATION
*pi2\pDevMode\dmOrientation = dmOrientation
*pi2\pSecurityDescriptor = 0
lFlag=DocumentProperties_(0, hPrinter, pPrinterName, *pi2\pDevMode, *pi2\pDevMode, #DM_IN_BUFFER|#DM_OUT_BUFFER)
If lFlag<>#IDOK
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
If *pDevMode
FreeMemory(*pDevMode)
EndIf
Debug "Fehler DocumentProperties() 2"
ProcedureReturn -8;#False
EndIf
bflag=SetPrinter_(hPrinter, 2, *pi2, 0)
If ~bFlag
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
If *pDevMode
FreeMemory(*pDevMode)
EndIf
Debug "Fehler SetPrinter_()"
ProcedureReturn -9;#False
EndIf
SendMessageTimeout_(#HWND_BROADCAST, #WM_DEVMODECHANGE, 0, pPrinterName, #SMTO_NORMAL, 1000, 0)
If *pi2
FreeMemory(*pi2)
EndIf
If hPrinter
ClosePrinter_(hPrinter)
EndIf
If *pDevMode
FreeMemory(*pDevMode)
EndIf
ProcedureReturn #True
EndProcedure
lpAppName$="WINDOWS"
lpKeyName$="DEVICE"
lpDefault$=""
lpFileName$="Win.Ini"
STDPrinterName$ = Space(#MAX_PATH)
GetPrivateProfileString_(@lpAppName$,@lpKeyName$,@lpDefault$, @STDPrintername$, #MAX_PATH, @lpFileName$)
STDPrintername$ = StringField(STDPrintername$, 1,",")
Debug MySetPrinter(@STDPrinterName$,1)
OpenWindow(0, 10,10,200,200,"")
Repeat
Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow
Aktuell bereiten mir diese Zeilen Probleme:
Code: Alles auswählen
// Driver is reporting that it doesn't support this change...
if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
if (pDevMode)
GlobalFree(pDevMode);
return FALSE;
}
// Specify exactly what we are attempting to change...
pi2->pDevMode->dmFields = DM_ORIENTATION;
pi2->pDevMode->dmOrientation = dmOrientation;
Code: Alles auswählen
If (~(*pi2\pDevMode\dmFields & #DM_ORIENTATION))
FreeMemory(*pi2)
ClosePrinter_(hPrinter)
If *pDevMode
FreeMemory(*pDevMode)
EndIf
Debug "Fehler: Änderung nicht unterstützt."
ProcedureReturn -7,#False
EndIf
*pi2\pDevMode\dmFields = #DM_ORIENTATION
*pi2\pDevMode\dmOrientation = dmOrientation
Kann mir da einer der C- und API-Gurus helfen, die Prozedur zum Laufen zu bekommen?Zeile 233: Verwendung einer undefinierten Struktur:.