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...
}
}
/**************************************************************************************************************

__________________________________________________
Code-Tags hinzugefügt
08.02.2011
RSBasic