c String übergabe für inotify

Fragen zu allen anderen Programmiersprachen.
lorenzhd
Beiträge: 3
Registriert: 07.08.2010 05:54

c String übergabe für inotify

Beitrag von lorenzhd »

Hallo Liebe Leute,
ich habe eine Frage die mich schon eine Weile beschäftigt. Eigentlich ist Google immer ein guter Freund, wenn man nicht mehr weiter weiß.
Aber auch Freunde können einen nicht immer helfen. ;-)

Nach dem Tutorial: „Mit C++ eine DLL erstellen und in Purebasic nutzen von milan1612“ (http://purebasic.fr/german/viewtopic.php?f=9&t=20107)
versuche ich statt eine Integer String zu übergeben auf einem Linux System. Bei der Übergabe des Integer habe ich keinerlei Probleme.
Nur eine Übergabe als String bekomme ich nicht hin.

Code: Alles auswählen

#include <fstream>
#include <string>
using namespace std;

#define EXPORT extern "C”

EXPORT int CountLines(const char* filename) {
  ifstream file(filename);
  int lineCount = 1;
  string line;
  
  while(getline(file, line)) {
    lineCount++;
  }
  
  return lineCount;
}

Das ganze brauchte ich für ein kleines Programm was wiederum Inotify benützt.

Code: Alles auswählen

/***********************************************
einfacher Zugriff auf Inotify Schnittstelle
************************************************/

#include <unistd.h>
#include <fcntl.h>
#include <linux/ppdev.h>
#include <linux/parport.h>
#include <sys/ioctl.h>

 #include <string.h>

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

	int fd;

  int length, i = 0;
  int fd;
  int wd;
  char buffer[BUF_LEN];

  char *ausgang;



//Parallerport allgemein
char parport_open(char *dev);


//Parallerport allgemein
char *PB_parport_open(char *dummy)
{

//printf( "Von DDummy %s \n", dummy );

  fd = inotify_init();

  if ( fd < 0 ) {
    perror( "inotify_init" );
  }


char dir[10]="/ver_a/";  //Verzeichniss


  wd = inotify_add_watch( fd, dir,
                         IN_ALL_EVENTS );
  length = read( fd, buffer, BUF_LEN );

  if ( length < 0 ) {
    perror( "read" );
  }

	//Für die rückgabe etc.
	char *state; //Speichert den Zustand der Datei
	char *returnString = malloc(BUF_LEN); //hierdrin wird der String zusammen gesetzt

  while ( i < length ) {
    struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
    if ( event->len ) {
      if ( event->mask & IN_ACCESS ) {
			strcpy(state, " IN_ACCESS");
      } else
      if ( event->mask & IN_MODIFY ) {
			strcpy(state, " IN_MODIFY");
      } else
      if ( event->mask & IN_ATTRIB ) {
			strcpy(state, " IN_ATTRIB");
      } else
      if ( event->mask & IN_CLOSE_WRITE ) {
			strcpy(state, " IN_CLOSE_WRITE");
      } else
      if ( event->mask & IN_CLOSE_NOWRITE ) {
			strcpy(state, " IN_CLOSE_NOWRITE");
      } else
      if ( event->mask & IN_CLOSE ) {
			strcpy(state, " IN_CLOSE");
      } else
      if ( event->mask & IN_OPEN ) {
			strcpy(state, " IN_OPEN");
      } else
      if ( event->mask & IN_MOVED_FROM ) {
			strcpy(state, " IN_MOVED_FROM");
      } else
      if ( event->mask & IN_MOVED_TO ) {
			strcpy(state, " IN_MOVED_TO");
      } else
      if ( event->mask & IN_MOVE ) {
			strcpy(state, " IN_MOVE");
      } else
      if ( event->mask & IN_CREATE ) {
			strcpy(state, " IN_CREATE");
      } else
      if ( event->mask & IN_DELETE ) {
			strcpy(state, " IN_DELETE");
	  } else
      if ( event->mask & IN_DELETE_SELF ) {
			strcpy(state, " IN_DELETE_SELF");
      } else
      if ( event->mask & IN_MOVE_SELF ) {
			strcpy(state, " IN_MOVE_SELF");
      }
    }
	
	//Erstellen des Strings...
	if( event->mask & IN_ISDIR) { //Überprüft ob es sich um ein Verzeichnis handelt
		if(i==0)
			strcpy(returnString, "Das Verzeichnis "); //Bei der ersten Datei wird der Komplette String überschrieben
		else
			strcat(returnString, "Das Verzeichnis "); //Danach wird nurnoch angehängt!
	} else {
		if(i==0)
			strcpy(returnString, "Die Datei ");
		else 
			strcat(returnString, "Die Datei ");
	}
	strcat(returnString, event->name); //Fügt den Dateinamen ein
	strcat(returnString, state); //Fügt den Status ein
	strcat(returnString, "\n"); //fügt das \n ein... 
	
    i += EVENT_SIZE + event->len;
  }

  ( void ) inotify_rm_watch( fd, wd );
  ( void ) close( fd );
	{
		//Rückgabe
		return returnString; //diese Funktion kann jetzt wie ein String behandelt werden...
	}
}
/**************************************************************************************************************
Ich wäre sehr dankbar :praise: für Hilfe!


__________________________________________________
Code-Tags hinzugefügt
08.02.2011
RSBasic
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Re: c String übergabe für inotify

Beitrag von 125 »

Hey,
wie sieht dein Aufruf bzw Import in PB aus?

MfG
125
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
lorenzhd
Beiträge: 3
Registriert: 07.08.2010 05:54

Re: c String übergabe für inotify

Beitrag von lorenzhd »

Hallo 125.
bist jetzt sieht er so aus!
Ich habe wirklich schon das eine oder andere versucht aber ohne Erfolg! :freak:
es muss doch gehen!?!

Code: Alles auswählen

;Der Prototyp für unsere Funktion in der DLL
PrototypeC ProtoCountLines(Filename.s)

;Die DLL öffnen
If Not OpenLibrary(0, "/home/dummy/Desktop/TestDll.dll")
  End
EndIf

;Eine globale Instanz unseres Prototypes, dem die Addresse der Funktion in der DLL zugewiesen wird
Global CountLines.ProtoCountLines = GetFunction(0, "CountLines")
Global parport_open.ProtoCountLines = GetFunction(0, "parport_open")


;Einfach aufrufen, heraus kommen sollte die Anzahl der Zeilen unserers C++ Codes
Debug CountLines("/home/dummy/Desktop/dll.cpp")

Debug parport_open("/home/dummy/Desktop/dll.cpp")

;String.s = PeekS(24538751201)
;Debug String

;Library schliessen (macht Purebasic auch automatisch nach Beenden des Programms)
CloseLibrary(0)
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Re: c String übergabe für inotify

Beitrag von 125 »

Hast du es schon mit

Code: Alles auswählen

Debug PeekS(parport_open("/home/dummy/Desktop/dll.cpp"));
versucht? Ansonsten dürfte er dir nur die Speicheradresse vom String rauswerfen.

MfG
125
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
lorenzhd
Beiträge: 3
Registriert: 07.08.2010 05:54

Re: c String übergabe für inotify

Beitrag von lorenzhd »

Erst mal vielen Dank!
Leider klappt es auch nicht :(

Um erst mal weiter zu kommen habe ich den Code auf ein paar Zeilen geändert.

Code: Alles auswählen

#include <unistd.h>

#include <fcntl.h>

#include <linux/ppdev.h>

#include <linux/parport.h>

#include <sys/ioctl.h>

 #include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/inotify.h>

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

#define EXPORT extern "C" 

EXPORT int CountLines(const char* filename) {
  ifstream file(filename);
  int lineCount = 1;
  string line;
 
  while(getline(file, line)) {
    lineCount++;
  }
 
  return lineCount;
}



EXPORT char parport_open(char *dev)
{

cout << dev << "\t" <<  "\n";
 char dir[10]="/ver_a/";  //Verzeichniss



	{
		//Rückgabe
		return dir[10]; //diese Funktion kann jetzt wie ein String behandelt werden...
	}
}

int main ( int argc , char *argv[]) {
	
	char dummy2[5]="und";

	parport_open(dummy2);
	cout << *dummy2 << "\t" <<  "\n";
	

}
spreche ich die erste Funktion an geht es wunderbar nur bei der zweiten bekomme ich den Fehler " Ungültiger Speicherzugriff" !!!

Ich versuche es so!

Code: Alles auswählen

;Der Prototyp für unsere Funktion in der DLL
PrototypeC ProtoCountLines(Filename.s)

;Die DLL öffnen
If Not OpenLibrary(0, "/home/dummy/Desktop/TestDll.dll")
  End
EndIf

;Eine globale Instanz unseres Prototypes, dem die Addresse der Funktion in der DLL zugewiesen wird
Global CountLines.ProtoCountLines = GetFunction(0, "CountLines")

Global parport_open.ProtoCountLines = GetFunction(0, "parport_open")


;Einfach aufrufen, heraus kommen sollte die Anzahl der Zeilen unserers C++ Codes
Debug CountLines("/home/dummy/Desktop/dll.cpp")

;Debug CountLines2("/home/dummy/Desktop/dll.cpp")
Debug parport_open("/ver_a")
;Debug PeekS(parport_open(""))

;Library schliessen (macht Purebasic auch automatisch nach Beenden des Programms)
CloseLibrary(0)
Antworten