Announcement

Collapse
No announcement yet.

Zugriff auf Netzwerkdrucker unter Windows NT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf Netzwerkdrucker unter Windows NT

    Mit CreateProcess bekomme ich unter Windows NT keinen Zugriff auf <br>
    Netzwerkdrucker bzw -verzeichnisse.<br>
    Konkret:<br>
    CreateProcess(nil,Pchar(P),nil,nil,False,<br>
    CREATE_SEPARATE_WOW_VDM or NORMAL_PRIORITY_CLASS,nil,nil,Startinf,Procinf)<br >
    mit P:='command.com /c copy datei \\rechner\drucker';<br>
    funktioniert nur unter Windows 98, NT liefert die Fehlermeldung<br>
    Path not found<br>
    Die Eingabeaufforderung arbeitet mit copy datei \\rechner\drucker <br>
    korrekt. Der lokale Drucker funktioniert ebenfalls :<br>
    P:='command.com /c copy datei lpt1:'; <br>
    Das gleiche gilt für freigegebene Verzeichnisse im Netz. <br>
    Kann mir jemand helfen? <br>
    Vielen Dank im voraus <br>
    Rolf Meidenbauer

  • #2
    Hallo,

    ich gehe einmal davon aus, das beim Aufruf von CreateProcess die Sicherheitsattribute (lpProcessAttributes) etc. als vererbbar gekennzeichnet werden müssen, damit COMMAND.COM erfolgreich auf die Netzwerk-Ressourcen zugreifen kann. Das habe ich aber nicht ausprobiert.

    Warum muss unbedingt <i>COMMAND.COM /C COPY datei LPT1:</i> verwendet werden? Das folgende Beispiel von <i>Joe Hecht</i> aus der Newsgroup <i>borland.public.delphi.winapi</i> macht das gleiche ohne den Umweg über COMMAND.COM:

    <i>Printing a file directly to a printer in Win32, code by Joe Hecht.
    Note that you have to include WinSpool in the uses clause.</i>
    <pre>
    procedure PrintFile(const sFileName: string);
    const
    BufSize = 16384;
    type
    TDoc_Info_1 = record
    pDocName: pChar;
    pOutputFile: pChar;
    pDataType: pChar;
    end;
    var
    Count, BytesWritten: integer;
    hPrinter: THandle;
    Device : array[0..255] of char;
    Driver : array[0..255] of char;
    Port : array[0..255] of char;
    hDeviceMode: THandle;
    DocInfo: TDoc_Info_1;
    f: file;
    Buffer: Pointer;
    begin
    Printer.PrinterIndex := -1;
    Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
    if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then exit;
    DocInfo.pDocName := 'MyDocument';
    DocInfo.pOutputFile := nil;
    DocInfo.pDatatype := 'RAW';
    if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
    begin
    WinSpool.ClosePrinter(hPrinter);
    exit;
    end;
    if not StartPagePrinter(hPrinter) then
    begin
    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
    exit;
    end;
    System.Assign(f, sFileName);
    try
    Reset(f, 1);
    GetMem(Buffer, BufSize);
    while not eof(f) do
    begin
    Blockread(f, Buffer^, BufSize, Count);
    if Count > 0 then
    begin
    if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then
    begin
    EndPagePrinter(hPrinter);
    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
    FreeMem(Buffer, BufSize);
    exit;
    end;
    end;
    end;
    FreeMem(Buffer, BufSize);
    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
    finally
    System.Closefile( f );
    end;
    end;
    </pre&gt

    Comment


    • #3
      Vielen Dank, das werde ich ausprobieren.<b>
      Ich habe auch eine andere Lösung gefunden:<b>
      cmd.exe statt command.com löst mein Problem auch.<b>
      Gruß Rolf Meidenbaue

      Comment


      • #4
        Hallo Andreas Kosch,<br>
        das Beispiel von Joe Hecht war genau das, was ich brauchte.<br>
        Besten Dank Rolf Meidenbaue

        Comment

        Working...
        X