Seite 1 von 1

[erledigt] Pointer To a buffer To be written To a file?

Verfasst: 12.12.2008 21:28
von scholly
moin, moin...
MSDN hat geschrieben:LONG mmioWrite(HMMIO hmmio, char _huge* pch, LONG cch);

Parameters

hmmio
File handle of the file.

pch
Pointer to the buffer to be written to the file.

cch
Number of bytes to write to the file.

Return Values
Returns the number of bytes actually written. If there is an error writing to the file, the return value is -1.
Wie muß ich das mit dem Buffer machen?

Mein Code:

Code: Alles auswählen

; change_riff-tag.pb

Define main_lpck.MMCKINFO
Define info_lpck.MMCKINFO
Define Itag_lpck.MMCKINFO

Define Itag_buff.s =Space(1024)
Define write_buf.s =Space(1024)

Define filename.s = "NASA.avi"
;Filename.s = OpenFileRequester("","","AVI Files (*.avi)|*.avi",0)

If Filename
   HMMIO = mmioOpen_(Filename,0,#MMIO_READWRITE)
   
   ; check FILE FORMAT
   main_lpck\fccType = mmioStringToFOURCC_("AVI ",MMIO_TOUPPER)
   
   Result = mmioDescend_(HMMIO,main_lpck,0,#MMIO_FINDRIFF)
   
   If Result <> #MMSYSERR_NOERROR
      Debug "Error:  Not an AVI file!" : End
   Else
      Debug "Suxes:  This is an AVI file!"
   EndIf
   
   ; find in LIST named INFO
   info_lpck\fccType= mmioStringToFOURCC_("INFO",MMIO_TOUPPER) 
   Result = mmioDescend_(HMMIO,info_lpck,0,#MMIO_FINDLIST)
   
   If Result <> #MMSYSERR_NOERROR     
      Debug "Error:  Couldn't get the LIST named INFO!"
   Else
      Debug "Suxes:  Found the LIST named INFO"
   EndIf
   
   ; find the existing chunk(tag) "INAM"
   Itag_lpck\ckid   = mmioStringToFOURCC_("INAM",MMIO_TOUPPER)
     
   Result = mmioDescend_(HMMIO,Itag_lpck,info_lpck,#MMIO_FINDCHUNK)
   
   If Result <> #MMSYSERR_NOERROR     
      Debug "Error:  Couldn't get the CHUNK named INAM !"
   Else
      Debug "Suxes:  Found the CHUNK named INAM"
   EndIf 
   
   ;Debug Itag_lpck\ckid
   Debug ""
   Debug "Itag_lpck\ckid        = "+PeekS(@Itag_lpck\ckid,4)

   Debug "Itag_lpck\cksize      = "+Str(Itag_lpck\cksize)

   ;Debug Itag_lpck\fccType
   Debug "Itag_lpck\fccType     = "+PeekS(@Itag_lpck\fccType,4)

   Debug "Itag_lpck\dwDataOffset= "+Str(Itag_lpck\dwDataOffset)
   Debug "Itag_lpck\dwFlags     = "+Str(Itag_lpck\dwFlags)
   Debug ""
   
  Debug "---------Try to change the contentes of INAM--------------"
  
  write_buf = "changed by me"
  Debug "write_buf    = changed by me"
  Debug "write_buflen = "+Str(Len(write_buf))
 
  wr_result = mmioWrite_(HMMIO,*write_buf,Len(write_buf))
  Debug wr_result
 
  Itag_lpck\dwFlags = #MMIO_DIRTY
  asc_result = mmioAscend_(HMMIO,Itag_lpck,0)
 
  If asc_result = MMIOERR_CANNOTSEEK
    Debug "MMIOERR_CANNOTSEEK:     There was an error while seekingto the end of the Chunk"
  ElseIf asc_result = MMIOERR_CANNOTWRITE
    Debug "MMIOERR_CANNOTWRITE:    The contents of the buffer could not be written to disk"
  Else
    Debug "unknown errorcode"
  EndIf
 
  mmioClose_(HMMIO,0)
   
EndIf
Kann nicht richtig sein, denn er zerschießt mein File.

Was mach ich falsch?

mDv...
scholly

Verfasst: 12.12.2008 22:04
von hjbremer
Define write_buf.s =Space(1024)

*write_buf

das sind zwei unterschiedliche Variablen !!!

ich denke es sollte @write_buf heißen, du kannst bei Api aufrufen aber das @auch weglassen. PB übergibt automatisch die Adresse der Zeichenkette oder Strukturvariablen.

zur Verdeutlichung:

Code: Alles auswählen


Define write_buf.s = Space(1024)
Define *write_buf

write_buf = " Hallo "

Debug *write_buf   

*write_buf = @write_buf

Debug *write_buf   
Debug PeekS(*write_buf)

die erste Debug Anzeige für *write_buf ergibt null, da dieser Variablen noch kein Wert zugewiesen wurde, folglich geht dein Apiaufruf
wr_result = mmioWrite_(HMMIO,*write_buf,Len(write_buf))
in die Hose

Verfasst: 12.12.2008 23:31
von scholly
hjbremer hat geschrieben:ich denke es sollte @write_buf heißen
Jo, sieht besser aus, :allright: für die schnelle Erleuchtung...

Allerdings scheine ich was generell falsch zu machen :(
Werd ich mal suchen, ob ich irgenwo was finde, aus dem ich lernen kann,
wie man die mmio-Funktionen zum ändern/schreiben von RIFF-Tags nutzen muß.

bis denne...
scholli

Verfasst: 12.12.2008 23:58
von AND51
hjbremer hat geschrieben:Define write_buf.s =Space(1024)

*write_buf

das sind zwei unterschiedliche Variablen !!!
Das ist ein weiterer, schöner, sinvoller Einsatzort für EnableExplicit. :)