Ersatz für open(name,modus=default) (C)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Ersatz für open(name,modus=default) (C)

Beitrag von t-z »

Hallo zusammen,

ich bin gerade dabei Funktionen der libvlc zu testen um die Bibliothek später in einem meiner Projekte zu verwenden. Leider bekomme ich oft nur Beispiele in anderen Sprachen, meist irgendeine C-Sprache.

libvlc_log_set_file ist laut Dokumentation folgendermaßen definiert:

Code: Alles auswählen

void 	libvlc_log_set_file (libvlc_instance_t *, FILE *stream)
Meist wird für stream der Rückgabewert der Funktion open(name,modus=default) übergeben. Diese Funktion existiert in Pascal meines Wissen aber nicht. Daher habe ich die Frage, wie ich der Funktion das file-handle übergebn kann. Gibt es also eine Möglichkeit z.B. mittels AssignFile oder TFileStream?

Ich löse immer eine Schutzverletzung (SIGSEGV) aus, wenn ich libvlc_log_set_file folgendermaßen definiere:

Code: Alles auswählen

  libvlc_log_set_file                : procedure(p_media_player : Plibvlc_media_player_t; var FileStream:TextFile) cdecl;
und dann folgenderweise nutze:

Code: Alles auswählen

  AssignFile(f, 'xxxxxxx\libvlc.log');
  Rewrite(f);
  libvlc_log_set_file(vlcMediaPlayer,f);
Ich gehe davon aus, dass das FileHandle, das AssignFile zurück gibt, vom Typ her ein anderes ist, als open() in C zurück gibt? Eine Variable des Typs file of * lässt sich jedenfalls nicht in einen LongWord konvertieren (und das gibt ja open() zurück).

Vielen Dank im Voraus.
Zuletzt geändert von t-z am Mo 17. Mär 2014, 00:44, insgesamt 2-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Ersatz für open(name,modus=default) (C)

Beitrag von Socke »

t-z hat geschrieben:libvlc_log_set_file ist laut Dokumentation folgendermaßen definiert:

Code: Alles auswählen

void 	libvlc_log_set_file (libvlc_instance_t *, FILE *stream)
Hast du die Definition des Datentyps stream. Ohne wird das mühselig.
t-z hat geschrieben:Meist wird für FILE (muss in Pascall natürlich abgeändert werden) der Rückgabewert der Funktion open(name,modus=default) übergeben. Diese Funktion existiert in Pascal meines Wissen aber nicht. Daher habe ich die Frage, wie ich der Funktion das file-handle übergebn kann. Gibt es also eine Möglichkeit z.B. mittels AssignFile oder TFileStream?
Bist du dir sicher, dass die Funktion open ein Dateihandle des Betriebssystems zurück liefert? Falls ja, hilft dir die Funktion FileOpen aus der Unit SysUtils weiter. Falls nicht, siehe oben.

Über TextFile und TFileStream kommt man auch an das Handle; beides ist aber umständlich, wenn man nichts weiter damit macht. Bei TFileStream ist das die Eigenschaft Handle. Bei TextFile geht sieht das so aus:

Code: Alles auswählen

var
  s: TextFile;
  r: TextRec absolute s;
begin
  FillByte(r, sizeof(r), 0);
  Assign(s, 'project1.lpi');
  Rewrite(s);
  writeln('Handle: ', r.Handle);
  close(s);
  readln;
end.    
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Ersatz für open(name,modus=default) (C)

Beitrag von t-z »

Über libvlc_log_set_file sagt die offizielle Dokumentation folgendes: http://www.videolan.org/developers/vlc/ ... b357d71751

Ich habe Version 2.1.3. Die Funktion existiert also. Da ich dies vorerst nur zum debuggen benötige ist es auch nicht weiter tragisch, dass sie noch vergleichsweise neu ist.

Ich habe z.b. folgendes Beispiel (Python) gefunden:

Code: Alles auswählen

vlc.libvlc_log_set_file(instance, open("log.txt", mode="w"))
mode="w" bedeutet dort nur, dass der optionale Parameter den Wert "w" zugewiesen bekommt. Python Dokumentation: http://www.tutorialspoint.com/python/py ... les_io.htm

Ich habe nun auch FileOpen() ausprobiert. Es kommt exakt die selbe Fehlermeldung, wie bei TFileStream.Handle ("77BF22D2 f00fba3000 lock btrl $0x0,(%eax)"). Es scheint also irrelevant, welche Variante ich verwende. Dagegen sieht die Fehlermeldung bei AssignFile() ander aus ("77C08E19 ff4014 incl 0x14(%eax)").

Es war aber noch ein Fehler drin: ich habe beim ersten Parameter die falsche Variable übergeben.

Code: Alles auswählen

  LogStream:=FileOpen('xxxxxxxxxx\libvlc.log',fmOpenWrite);
  LogStream2:=TFileStream.Create('xxxxxxxxxxx\libvlc2.log',fmCreate);
  AssignFile(LogStream3,'xxxxxxxxxxxxxx\libvlc3.log');
  Rewrite(LogStream3);
  libvlc_set_log_verbosity(vlcInstance, 2);
  //libvlc_log_set_file(vlcInstance,LogStream);
  //libvlc_log_set_file(vlcInstance,LogStream2.handle);
  libvlc_log_set_file2(vlcInstance,LogStream3);
alles was ich aus der c/python-Dokumentation weis deutet eher auf AssignFile hin. Aber hier wird libvlc_log_set_file mit nem THandle deklariert:

Code: Alles auswählen

var
  libvlc_log_set_file : procedure (
    p_instance: libvlc_instance_t_ptr;
    stream : THandle
  ); cdecl;
Dies würde auf FileOpen / TFileStream hindeuten.

Edit:
Ich habe nun auch mal versuch Pointer zu übergeben. Das Ergebnis ist exakt das selbe, wie mit AssignFile(). Schlussfolgerung: FileOpen() / TFileStream.Handle muss richtig sein.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Ersatz für open(name,modus=default) (C)

Beitrag von mse »

C "FILE" ist vergleichbar mit einem Pascal "text" file. Für ein GNU-Linux ist es z.B so definiert:

Code: Alles auswählen

 
typedef struct _IO_FILE FILE;
 
struct _IO_FILE {
  int _flags;		/* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
 
  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;	/* Current read pointer */
  char* _IO_read_end;	/* End of get area. */
  char* _IO_read_base;	/* Start of putback+get area. */
  char* _IO_write_base;	/* Start of put area. */
  char* _IO_write_ptr;	/* Current put pointer. */
  char* _IO_write_end;	/* End of put area. */
  char* _IO_buf_base;	/* Start of reserve area. */
  char* _IO_buf_end;	/* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */
 
  struct _IO_marker *_markers;
 
  struct _IO_FILE *_chain;
 
  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */
 
#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];
 
  /*  char* _save_gptr;  char* _save_egptr; */
 
  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};
 
Also ziemlich ungenissbar und Compiler-abhängig. ;-)

Falls die libvlc_log_set_file()-Funktion nicht in einer file-descriptor-Version vorhanden ist, gibt es vielleicht FILE-interface Funktionen in der C-Bibliothek. Falls nicht, muss wohl fopen() aus der entsprechen libc aufgerufen werden um zu einem C-FILE-pointer zu kommen. Ich würde mal bei den Autoren der Bibliothek nachfragen, wie die Einbindung in nicht-C Sprachen vorgesehen ist.

wp_xyz
Beiträge: 5129
Registriert: Fr 8. Apr 2011, 09:01

Re: Ersatz für open(name,modus=default) (C)

Beitrag von wp_xyz »

ich bin gerade dabei Funktionen der libvlc zu testen
Du weißt schon, dass deine Lazarus-Installation im Ordner components/vlc einen fertigen vlc-Player enthält?

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Ersatz für open(name,modus=default) (C)

Beitrag von t-z »

ja, der bringt mich aber leider nicht weiter, da ich den Datenstrom benötige um ihn weiter zu verarbeiten. Dort macht eine Funktion schlichtweg nichts. Da es aber keine Fehlermeldung gibt benötige ich die Log von VLC.

Antworten