Seite 4 von 6

Verfasst: 08.10.2006 10:25
von #NULL
dw hat geschrieben:OpenFile(0,"PureBasic.exe")
CreateFile(1,"PB.exe")
While Not Eof(0)
WriteByte(1,ReadByte(0))
Wend
CloseFile(0)
CloseFile(1)
null hat geschrieben:kann das denn gehen während die IDE läuft ?
->

Code: Alles auswählen

If ReadFile(0,"PureBasic.exe")
  If CreateFile(1,"PB.exe")
    While Not Eof(0)
      WriteByte(1,ReadByte(0))
    Wend
    CloseFile(1)
  EndIf
  CloseFile(0)
EndIf

Verfasst: 08.10.2006 10:26
von Andreas
Probier doch mal CopyFileEx_()

Damit kannst Du eine Callback-Funktion nutzen.

Code: Alles auswählen

;Windows Me/98/95:  benötigt Microsoft Layer For Unicode

  #CALLBACK_CHUNK_FINISHED = 0
  #COPY_FILE_RESTARTABLE = $2
  #PROGRESS_CONTINUE = 0
  
  Procedure CopyCB(a.q,b.q,c.q,d.q,e.l,f.l,g.l,h.l,i.l)
  Shared x.l
  Select f
     Case #CALLBACK_CHUNK_FINISHED
        SetGadgetState(1,Int((100/c)*d))
        SetGadgetText(2,Str(Int((100/c)*d))+"%")
        SetGadgetText(3,Str((GetTickCount_()/1000)-i)+" Sec")
        If x = 0
           SetGadgetText(4,"von ca. "+Str(Round(((GetTickCount_()/1000)/c) *d,1))+" Sec")
           x = 1
        EndIf
  EndSelect
  ProcedureReturn #PROGRESS_CONTINUE
  EndProcedure
  
  If OpenWindow(0, 0, 0, 400, 120, "CopyFileEx", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 20, "Copy")
    ProgressBarGadget(1, 10, 60,  380, 16, 0, 100,#PB_ProgressBar_Smooth)
    TextGadget(2, 370, 40, 30, 20, "0%")
    TextGadget(3, 10, 40, 30, 20, "0 Sec")
    TextGadget(4, 100, 40, 100, 20, "von ca. 0 Sec")
    Repeat 
    ID = WaitWindowEvent()
    Select ID
       Case #PB_Event_Gadget
       Select EventGadget()
         Case 0
           SetGadgetState(1,0)
           SetGadgetText(2,"0%")
           SetGadgetText(3,"0 Sec")
           SetGadgetText(4,"von ca. 0 Sec")
           
           ;Filenamen anpassen
           Status = CopyFileEx_("1.rar","2.rar",@CopyCB(),GetTickCount_()/1000,0,#COPY_FILE_RESTARTABLE)
           
           SetGadgetState(1,0)
           If Status <> 0
              MessageRequester("Copy...","Kopieren erfolgreich",0)
           Else
              MessageRequester("Copy...","Kopieren nicht erfolgreich",0)
           EndIf
       EndSelect
       Case #PB_Event_CloseWindow
          Quit = 1
    EndSelect
    Until Quit = 1 
  EndIf

Verfasst: 08.10.2006 11:54
von RSBasic
@ Andreas
Ich habe noch unter 3.30 dein Code versucht, aber es gab ne Fehlermeldung und ich weis nicht, wie ich dieses Problem beheben kann.

Code: Alles auswählen

Procedure CopyCB(a.q,b.q,c.q,d.q,e.l,f.l,g.l,h.l,i.l)
>Structure not found: q<

Kannst du mir helfen?

Verfasst: 08.10.2006 12:03
von #NULL
3.3 kennt keine quads

Verfasst: 08.10.2006 12:05
von RSBasic
@ #NULL
deshalb :D
Aber es wird sich ändern :mrgreen:

Verfasst: 08.10.2006 12:12
von Kaeru Gaman
yo, das is leider nicht so mal eben umsetzbar, quads in 3.3 zu emulieren...

aber.. ist das denn nötig?

@Andreas

bin ich grad blind, oder verwendest du a und b in deiner proc garnicht?
brauch man sie also nur als platzhalter für die argumentübergabe der API?
dann kann man se ja ganz easy emulieren, und muss sich kein kopp ums auswerten machen.

Code: Alles auswählen

Structure q
  L1.l
  L2.l
EndStructure

Code: Alles auswählen

;Windows Me/98/95:  benötigt Microsoft Layer For Unicode 
also, unter 2k/XP sollte es so laufen, ohne zusätze?
(nur ob ich den hinweis richtig interpretiere...)

Verfasst: 08.10.2006 12:19
von ts-soft
für Win9x ist die unicows.dll nötig, wird von PB aber nicht unterstützt.

// Edit
Das mit der Structure wird nicht gehen, da PB keine structurierten Parameter unterstützt, aber vielleicht gehts mit einem Long???

Verfasst: 08.10.2006 16:59
von Andreas
@Andreas

bin ich grad blind, oder verwendest du a und b in deiner proc garnicht?
brauch man sie also nur als platzhalter für die argumentübergabe der API?
dann kann man se ja ganz easy emulieren, und muss sich kein kopp ums auswerten machen.
Die Callback-Prozedur erwartet 9 Parameter.

LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData

Das sind also im Grunde genommen keine Platzhalter, die können alle ausgewertet werden.

Verfasst: 08.10.2006 20:18
von Kaeru Gaman
ja ok, können, aber für den "hausgebrauch" könnte man das auch mit einer struct wie oben emulieren, oder? ;)

Verfasst: 08.10.2006 22:56
von ts-soft
Kaeru Gaman hat geschrieben:ja ok, können, aber für den "hausgebrauch" könnte man das auch mit einer struct wie oben emulieren, oder? ;)
Nein, siehe Beitrag vorher.
Parameter sind alle long in PB vor 4.