AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Bandlaufwerk / Streamer ansprechen unter Delphi.
Thema durchsuchen
Ansicht
Themen-Optionen

Bandlaufwerk / Streamer ansprechen unter Delphi.

Offene Frage von "shifter"
Ein Thema von shifter · begonnen am 7. Nov 2005 · letzter Beitrag vom 19. Aug 2009
Antwort Antwort
Seite 2 von 4     12 34      
Robert Marquardt
(Gast)

n/a Beiträge
 
#11

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 8. Nov 2005, 08:35
ByteBool statt Boolean ist sicherer.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 8. Nov 2005, 11:35
Zitat von Robert Marquardt:
ByteBool statt Boolean ist sicherer.
Da gebe ich dir Recht, aber ich hab' mich da an das Vorbild "Windows.pas" gehalten - Borland hat auch alles mit dem Typ "Boolean" deklariert.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 8. Nov 2005, 22:42
Also bis jetzt waren das Relativ kleine Problemme, Problemme auf die eine lösung in sicht war. Jetzt bin ich auf ein problemm gestossen wo nichtmal msdn von ms konnte mir helfen.

PrepareTape

Zitat:
TAPE_FORMAT
5L Performs a low-level format of the tape. Currently, only the QIC117 device supports this feature.
Es ist nicht unbedingt das modernste und ich denke kaum einer hat noch solch ein oldtimer.

Ich brauch es für mein Streamer Tandberg Data SLR bis 200GB oder DDS3 und 4 bis 40GB.

Habt Ihr vieleicht eine idee warum wird die PrepareTape Function nicht unterstützt ?
Gibts vieleicht irgend wo eine externe DLL die mann von Delphi aus nutzen kann ?

MfG
Seba
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 8. Nov 2005, 23:24
Und noch was,

Wenn der Windows 2K und WXP kann eine sicherung machen auf oben gennanten Laufwerken dann musste das doch funktionieren ohne zusätzlichen DLL's die nicht in System vorhanden sind.
Die Frage bleibt, wie es funktioniert.
Bei msdn bin ich noch gestossen auf msdn eine kleinichkeit, ich weis es aber nicht womit mann das essen kann.

gruss
seba
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 9. Nov 2005, 07:13
zu 1. Das Band kann wahrscheinlich nicht formatiert werden, ähnlich wie man moderne Festplatten nicht mehr Low-Level-Formatieren sollte. Nimm statt dessen einfach TAPE_ERASE_LONG, dass macht das Band auch leer.

zu 2. Die Seite ist über Treiber, nicht über die Anwendungssoftware.

Schau dir wirklich mal den Link von oben an (http://holistech.co.uk/sw/mt/mt.c) - das ist zwar in C, aber (fast) alle Tape-Kommmandos sind implementiert.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 9. Nov 2005, 09:24
Hallo und Guten Morgen,

danke für deine Antwort, du hast Recht, ich habe es gelöscht und auch hast du Rech mit dem LowLevel. Andere Grosse Software hersteller ( Veritas unc co. ) nutzen auch das nicht mehr.
Ich habe diesen mt.c mir genau angeschaut leider fehlt da BackupWrite, und da komme ich nicht mit zu recht.
Damit habe ich zwei Problemme,

1:
Code:
BOOL BackupWrite(
  HANDLE hFile,
  LPBYTE lpBuffer,
  DWORD nNumberOfBytesToWrite,
  LPDWORD lpNumberOfBytesWritten,
  BOOL bAbort,
  BOOL bProcessSecurity,
  LPVOID* lpContext
);
ich bekomme nirgends wo Informationen wie soll lpContext aufgebaut sein.

2:
Das zweite problemm kommt wenn mann kein C beherst.

Code:
LPBYTE lpBuffer
Hier kommt doch ein Pointer ins Spiel


Ich habe den BackupWrite so varstanden :
Delphi-Quellcode:
...
str : TMemoryStream;
ou : dWord;
lpc : _CONTEXT;

...

BackupWrite( TapeHandle,@str,str.Size, @ou, False, False, @lpc );
Es wird Bemengelt von den Compiler @ou,
Wenn ich aber "ou" ohne "@" reinsetzte ist es wieder o.k.
Und das macht mich irre, ich denke doch wenn es LPBYTE oder LPDWORD in C steht handelt es sich um ein Pointer.
Und das mit dem @lpc klappt auch nicht.


Help

seba
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 9. Nov 2005, 09:33
Du musst natürlich auch beachten, wie die "Übersetzung" in Windows.pas aussieht.

Delphi-Quellcode:
function BackupWrite(hFile: THandle; lpBuffer: PByte; nNumberOfBytesToWrite: DWORD;
  var lpNumberOfBytesWritten: DWORD; bAbort, bProcessSecurity: BOOL; var lpContext: Pointer): BOOL; stdcall;
lpContext ist einfach ein Zeiger, den du Anfangs mit nil initialisieren musst und einfach bei allen weiteren Aufrufen wieder angibst, ohne den Inhalt zu verändern - sonst muss dich dieser Parameter nicht interessieren. Wenn du fertig bist mit dem Schreiben, dann musst du halt BackupWrite noch einmal mit eben diesem Zeiger aufrufen und bAbort auf true setzen - das gibt den Speicher wieder frei. (Steht übrigens alles im PSDK zu BackupWrite)

lpBuffer ist ein Zeiger auf die Daten - in deinem Fall, bei einem TMemoryStream, würdest du hier str.Memory angeben.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 9. Nov 2005, 10:12
Flocke nicht aufregen,

Delphi-Quellcode:
Var str : TMemoryStream;
    ou : dword;
    lcm : pointer;
begin
    TapeHandle := OPENDRIVE;

    str := TMemoryStream.Create;
    str.LoadFromFile('C:\mt.exe');

    lcm := nil;
    ou := 0;

    showmessage(inttostr(str.Size)); // Länge des mt.exe = 23040

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, false,false, lcm );

    showmessage(inttostr(ou)); // Geschriebene länge = 204

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, true,false, lcm );


    str.Free;

    CLOSEDRIVE;
Passiert nichts. Irgend wo mache ich noch fehler.

Andere Frage,

Was ist TapeMark ? Ist das änlich mit cluster auf hdd ?

Gruss
seba
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 9. Nov 2005, 22:39
Bei dem MT.EXE SourceCode habe ich folgendes :

Code:
SetTapePosition( tapedrive, TAPE_ABSOLUTE_BLOCK,0,(DWORD)(position & 0xffffffff),
   (DWORD)((position >> 32) & 0xffffffff),FALSE)
Da ich von C nichts verstehe wie kann man es übersetzten?
(DWORD)(position & 0xffffffff)
und
(DWORD)((position >> 32) & 0xffffffff)

Es handelt sich hierbei um
Zitat:
dwOffsetLow
[in] Low-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter.
dwOffsetHigh
[in] High-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter. If the high-order bits are not required, this parameter should be zero.
Gruss
Seba
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 10. Nov 2005, 07:00
Wieso habe ich denn Gestern deine neuen Beiträge nicht mitbekommen

Zitat von shifter:
Flocke nicht aufregen,

Delphi-Quellcode:
Var str : TMemoryStream;
    ou : dword;
    lcm : pointer;
begin
    TapeHandle := OPENDRIVE;

    str := TMemoryStream.Create;
    str.LoadFromFile('C:\mt.exe');

    lcm := nil;
    ou := 0;

    showmessage(inttostr(str.Size)); // Länge des mt.exe = 23040

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, false,false, lcm );

    showmessage(inttostr(ou)); // Geschriebene länge = 204

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, true,false, lcm );


    str.Free;

    CLOSEDRIVE;
Passiert nichts. Irgend wo mache ich noch fehler.
Zunächst einmal (war mir vorher gar nicht so aufgefallen) - man benutzt die Funktionen BackupRead und BackupWrite dazu, die eigentlichen Dateien auf der Festplatte auszulesen und zu schreiben, und nicht das Band. Das Band wird einfach mit WriteFile beschrieben und mit ReadFile gelesen.

<Hinzugefügt>
Mit BackupRead liest man nicht nur die reinen Daten einer Datei, sondern alle Streams (z.B. die ACLs, also die Zugriffsrechte). Dabei bekommst du für jeden Stream jeweils eine WIN32_STREAM_ID-Struktur inkl. des Namens und im Anschluss daran die Daten des Streams, deren Größe im Feld Size angegeben ist (evtl. plus Füll-Bytes, um auf 32-Bits auszurichten).

Wenn du also alle Daten, die du mit BackupRead liest, mit BackupWrite wieder schreibst, dann stellst du nicht nur den Inhalt der Datei wieder her sondern auch alle anderen Attribute.
</Hinzugefügt>

Zitat von shifter:
Andere Frage,

Was ist TapeMark ? Ist das änlich mit cluster auf hdd ?

Gruss
seba
Mit WriteTapeMark kannst du Markierungen auf das Band schreiben, z.B. den Beginn einer neuen Datei kennzeichnen. Mit SetTapePosition kannst du dann eine bestimmte Markierung gezielt ansteuern.

Zitat von shifter:
Bei dem MT.EXE SourceCode habe ich folgendes :

Code:
SetTapePosition( tapedrive, TAPE_ABSOLUTE_BLOCK,0,(DWORD)(position & 0xffffffff),
   (DWORD)((position >&gt; 32) &amp; 0xffffffff),FALSE)
Da ich von C nichts verstehe wie kann man es übersetzten?
(DWORD)(position & 0xffffffff)
und
(DWORD)((position >> 32) & 0xffffffff)

Es handelt sich hierbei um
Zitat:
dwOffsetLow
[in] Low-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter.
dwOffsetHigh
[in] High-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter. If the high-order bits are not required, this parameter should be zero.
Gruss
Seba
(DWORD)(position & 0xffffffff) - die unteren 32 Bits
(DWORD)((position >> 32) & 0xffffffff) - die oberen 32 Bits

Wenn du nur mit Integer arbeitest (für Dateizähler bzw. Dateigröße), dann kannst du für dwOffsetHigh einfach 0 angeben.

Wenn du mit Int64 arbeitest, dann nimm LARGE_INTEGER(Zahl).LowPart und LARGE_INTEGER(Zahl).HighPart
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz