![]() |
C nach Delphi übersetzen
Hi,
durch Luckies Tut. ![]() ![]() Leider werde ich aus dem Code nicht schlau was die Funktion macht, wer kann helfen ?
Code:
Und wie lässt sich diese Codestelle umsetzen ?
// Printer name precedes first "," character.
strtok(cBuffer, ",");
Code:
:gruebel:
BOOL DPGetDefaultPrinter(LPTSTR pPrinterName, LPDWORD pdwBufferSize)
{ PRINTER_INFO_2 *ppi2 = NULL; // var // ppi2: ^PRINTER_INFO_2; // ... // Allocate enough space for PRINTER_INFO_2. ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded); |
Re: C nach Delphi übersetzen
Zitat:
Zitat:
|
Re: C nach Delphi übersetzen
Naja, da wird ganz eindeutig Speiher zugewiesen. Mit New oder AllocMem solltest du das hinbekommen, der Speicherbereich, der als Pointer zurückgegeben wird, wird allerdings (C ist da wohl so typensicher) gleich nach PPrinterInfo2 (In Delphi ausgedrückt) gecastet, was bei dir nicht notwendig sein sollte. Evtl. kannst du dir auch gleich den Record deklarieren und Delphi übernimmt die Speicherverwaltung.
strtok: Kann man wohl mit der ![]()
Code:
(hoffe, das würde in C oder wenigstens C++ so durchkompilieren. Bin ja schließlich kein Muttersprachler ;) )
string s = strtok("a b c"," ");
if (s == "a") Showmessage(Handle, "Works as expected","Success!"); Ach ja, ne Übersetzung:
Delphi-Quellcode:
@Mystic: Jop.
type
pInteger = ^Integer; PPrinter_Info_2 = ^PRINTER_INFO_2; function DPGetDefaultPrinter(pPrinterName: PChar; pdwBufferSize: PInteger): Boolean; var ppi2: PPrinter_Info_2; begin ppi2 := PPrinter_Info_2(GetMem(dwNeeded)); //dwNeeded ist wohl ein DWord, das den benötigten Speicher angibt. //keine Ahnung, was der GPTR da noch wollte, vielleicht braucht man da in C bzw. braucht die WinAPI da noch ein Hasndle irgendwohin. end; |
Re: C nach Delphi übersetzen
Hi Matti,
Zitat:
Delphi-Quellcode:
Grüße vom marabu
var
Buffer: String; begin // Printer name precedes first "," character. // Methode "es gibt kein morgen" SetLength(Buffer, Pred(Pos(',', Buffs))); // Methode "nix wegschmeißen" Buffer := Copy(Buffer, 1, Pred(Pos(',', Buffer))); // Methode "keiner hat's gesehen" Buffer[Pos(',', Buffer)] := #0; // strtok() end; |
Re: C nach Delphi übersetzen
Was hast du denn vor? Den Standarddrucke runter Windows 9x zu bekommen? Einfach bei EnumPrinters den entsprechenden Flag setzen. Steht alles im PSDK / MSDN. Und ich aheb zu allen verwendeten API Funktionen eine Linkliste ins MSDN angehangen.
|
Re: C nach Delphi übersetzen
Zitat:
in Windowsversionen von 98 ++ ;) zu verwenden. Unter Verwendung dieses ![]()
Delphi-Quellcode:
Unter win 98 und XP funktioniert das schon mal, mit Win NT kann ich es leider nicht testen...
program Project1;
uses Windows, WinSpool; type TPRINTER_INFO_5 = PRINTER_INFO_5; PPRINTER_INFO_5 = ^TPRINTER_INFO_5; // function GetDefaultPrinterA(prnName: LPTSTR; var bufSize: DWORD): BOOL; stdcall; // external 'winspool.drv' name 'GetDefaultPrinterA'; TGetDefaultPrinter = function(prnName: LPTSTR; var bufSize: DWORD): BOOL; stdcall; var lzPrinterName: array[0..1024] of Char; function GetDefaultPrinterName(PrinterName: LPTSTR; BufferSize: DWORD): DWORD; var osvi: OSVERSIONINFO; dwNeeded, dwReturned, lErr, BuffSize: DWORD; pPII5: PPRINTER_INFO_5; hWinSpoolDrv: THandle; GetDefaultPrinter: TGetDefaultPrinter; begin GetDefaultPrinter := nil; lErr := 0; osvi.dwOSVersionInfoSize := sizeof(OSVERSIONINFO); GetVersionEx(osvi); if (osvi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then begin if not EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 5, nil, 0, dwNeeded, dwReturned) then lerr := GetLastError; pPII5 := PPRINTER_INFO_5(LocalAlloc(LPTR, dwNeeded)); if pPII5 = nil then begin lerr := GetLastError; end else begin if not EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 5, PBYTE(pPII5), dwNeeded, dwNeeded, dwReturned) then begin lerr := GetLastError; end else begin if (dwReturned > 0) then begin if (DWORD(lstrlen(pPII5.pPrinterName)) > BufferSize - 1) then lerr := ERROR_INSUFFICIENT_BUFFER else begin lstrcpy(PrinterName, pPII5.pPrinterName); lerr := ERROR_SUCCESS; end; end else begin lstrcpy(PrinterName, '0'); // !? lerr := ERROR_SUCCESS; end; end; LocalFree(DWORD(pPII5)); // !? end; end else if (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin if (osvi.dwMajorVersion >= 5) then // Windows 2000 or later begin BuffSize := BufferSize; hWinSpoolDrv := LoadLibrary('WinSpool.drv'); if hWinSpoolDrv <> 0 then @GetDefaultPrinter := GetProcAddress(hWinSpoolDrv, 'GetDefaultPrinterA'); if @GetDefaultPrinter <> nil then begin if not GetDefaultPrinter(PrinterName, BuffSize) then lerr := GetLastError else lerr := ERROR_SUCCESS; end else lerr := ERROR_SUCCESS; if hWinSpoolDrv <> 0 then FreeLibrary(hWinSpoolDrv); end else // Windows NT 4.0 or earlier begin if (GetProfileString('windows', 'device', '', PrinterName, BufferSize) = BufferSize - 1) then lerr := ERROR_INSUFFICIENT_BUFFER else lerr := ERROR_SUCCESS; PrinterName[Pos(',', PrinterName)-1] := #0; end; end; Result := lerr; end; BEGIN GetDefaultPrinterName(lzPrinterName, sizeof(lzPrinterName)); MessageBox(0, lzPrinterName, 'DefaultPrinter:', MB_OK); END. PS.: "// !?" = unsichere Stellen ;) |
Re: C nach Delphi übersetzen
Hi,
...ich nochmal. Ich grübele gerade über diese Codestelle:
Code:
Die macht für mich keinen Sinn, da mit der Variable p (PChar bzw. Pointer of Char) nichts weiter angefangen wird. Ist das richtig ?
DWORD GetDefaultPrinterName(LPTSTR PrinterName, DWORD BufferSize)
{ /* ... */ char* p; /* ... */ { if (GetProfileString("windows","device","",PrinterName,BufferSize) == BufferSize-1) return ERROR_INSUFFICIENT_BUFFER; p = PrinterName; while (*p != '0' && *p != ',') ++p; *p = '0'; rc = ERROR_SUCCESS; } } return rc; } |
Re: C nach Delphi übersetzen
Denk daran, dass es ein Pointer ist. Änderungen an den Daten, auf die p zeigt ändern auch die Daten, auf die PrinterName zeigt, da es die selben sind.
Code:
Der Code setzt die erste Null oder das erste Komma (je nachdem, was zuerst kommt) in der Zeichenfolge PrinterName auf Null.
p = PrinterName;
while (*p != '0' && *p != ',') ++p; *p = '0' |
Re: C nach Delphi übersetzen
Achso, p zeigt auf PrinterName. Also könnte ich ja auch direkt mit PrinterName arbeiten.
thx. |
Re: C nach Delphi übersetzen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz