Windows Funktionen in Linux kompatible Funktionen umschreiben
-
Hallo
Ich habe die Frage zwar schon in meinem anderen Thread im C++ (ging um was anderes als dieser hier) gestellt,aber da dieser Bereich extra für Linux-Programmierung vorgesehen ist, dachte ich mir,dass ich sie lieber hier nochmal stelle.
Ich würde gerne folgenden Code Linuxkompatibel machen:
[cpp
//ausgeben
void CTextdatei::ausgeben()
{
int i=0;string name;
int Zeit;int j=2;
while (getline(pIFStream,name))
{
//Dynamischer Speicher wird angelegt
char dynamischesArray;
char* Puffer=new char[200];dynamischesArray = new char[name.length()+1];
copy(name.begin(), name.end(), dynamischesArray);
dynamischesArray[name.length()] = '\0';Zeit=dynamischesArray[0];
j=2;
for (int i=0;i<30;i++)
{
//Nur die Adresse(ab Stelle 3) ohne Zeit wird übergeben
Puffer[i]=dynamischesArray[j];
j++;
}ShellExecute(0,"open",Puffer,0,0,SW_SHOWNORMAL);
Sleep(Zeit*100);
//Speicher wird wieder freigegeben
delete[] dynamischesArray;
delete[] Puffer;}
}[/cpp]
Da ich mich mit Linux überhaupt nicht auskenne geschweigedenn jemals dafür etwas programmiert habe,bräuchte ich dringend Hilfe.
-
Nur so als Tipps:
getline() -> fgets()
ShellExecute() -> system()
Sleep() -> usleep()
-
Martin G schrieb:
Nur so als Tipps:
getline() -> fgets()
getline as in std::getline? Ne, das ist ne Standard-C++-Funktion. Die gibt es überall.
@B.D.
man -k <was du suchst>
(also nicht den Namen der Windows-Funktion, sondern ungefähr was die Funktion machen soll!) und die POSIX, glibc-Doku sollten dir weiter helfen. Siehe auch FAQ für entsprechende Links.
-
Kann man es so verwenden?
#include "Textdatei.h" #include <fstream> #include <iostream> #include <unistd.h> #include <stdlib.h> #include <string> //ausgeben void CTextdatei::ausgeben() { string name; int i=0; int Zeit; int j=2; while (getline(*pIFStream,name)) { //Dynamischer Speicher wird angelegt char* dynamischesArray; char* Puffer=new char[200]; dynamischesArray = new char[name.length()+1]; copy(name.begin(), name.end(), dynamischesArray); dynamischesArray[name.length()] = '\0'; Zeit=dynamischesArray[0]; j=2; for (int i=0;i<30;i++) { //Nur die Adresse(ab Stelle 3) ohne Zeit wird übergeben Puffer[i]=dynamischesArray[j]; j++; } system(Puffer); usleep(Zeit*100); //Speicher wird wieder freigegeben delete[] dynamischesArray; delete[] Puffer; } }
-
Also ich hab es jetzt soweit, dass er das Programm compiliert und eine ausführbaere Datei erstellt.Wenn ich diese nun ausführen möchte, dann zeigt mir die Konsole folgendes an:
sh: www.google.de: command not found
sh: www.ebay.de: command not found
sh: www.amazon.de: command not found
sh: www.computerbase.de: command not found
sh: www.gmx.de: command not foundDaraus schließe ich, dass ich wohl die System() funktion falsch verwendet habe.Kann mir nicht jemand die genau Syntax zeigen, mit der ich die Internetadressen aufrufen kann?
-
was soll die Funktion denn machen? (Du kannst nicht erwarten, dass die Leute im Unix Forum die WinAPI Funktionen auswendig kennen...
)
man: system(3) gibt einfach nur den übergebenen String an eine Shell weiter.
-
Achso stimmt,sorry.Ist mir garnicht aufgefallen, dass ich es nicht erläutert habe
Also ich möchte mittels ShellExecute eine URL mit dem Standardbrowser öffnen, die in der Variable Puffer enthalten ist .Das klappt in Windows wunderbar.Nun möchte ich dies so umbauen, dass es in Linux die selbe Funktionsweise hat.Bin schon ziemlich lange an dieser Aufgabe dran, aber da ich alleine damit nicht klarkomme, obwohl ich mir die von rüdiger angegebene Seite mehrmals durchgelesen habe, und auch schon das Forum von oben bis unten durchsucht habe,wäre es seht nett, wenn mir jemand dabei helfen würde
-
Naja, sowas wie einen Standardbrower gibt es unter linux nicht. Bei gnome ist das beste äquivalent wohl gnome-www-browser. Ich würde vorschlagen, dass du das konfigurierbar machst (umgebungsvariable z.B.). System gibt, wie gesagt, den string an eine shell weiter. Wenn dein puffer nur die url enthalt, musst du halt system (program + ' ' + buffer) verwenden..
-
@ness
doch gibt es, hat sich nur nicht durchgesetzt bisher http://www.catb.org/~esr/BROWSER/Aber so was kann man ja auch für sein Programm einfach festlegen.
-
rüdiger schrieb:
@ness
doch gibt es, hat sich nur nicht durchgesetzt bisher http://www.catb.org/~esr/BROWSER/Aber so was kann man ja auch für sein Programm einfach festlegen.
das erinnert mich an bisschen an einer Diskussion, die wir hier vor ein Paar Monaten über Elektra hatten
ich denke, der Grund, warum BROWSER sich nicht durchsetzt, sind Desktop Env. wie KDE oder Gnome, die ein eigenes "default browser" System haben.
-
Das Problem ist wohl eher, das GNOME oder KDE deine .profile ändern müssten, wenn du den Standard-Browser änderst und so tief greifen die ja nicht ins System ein.
Aber wie gesagt, einfach $BROWSER-implementieren und sagen das man es so erwartet. Habe ich zB für ein sawfish-script auch so gemacht.
-
Tut mir Leid,aber ihr schreibt immer von einfach,einfach,einfach
Für mich ist es irgendwie nicht so einfach.Ich kapier die Sache mit der Browser Variable irgendwie nicht.Auf der Seite steht ja z.B.
For example, on most Linux systems a good thing to do would be:BROWSER="netscape -raise -remote \"openURL(%s,new-window)\":lynx"
Aber die Browser Variable ist ja nicht vorhanden,aber wie/wo muss ich die genau anlegen?
-
du machst einfach in der Konsole
export BROWSER="dein Browser String"
(das kannst du auch in die Datei ~/.profile packen)und man: getenv(3) benutzt du um die Variable auszulesen.
-
Ich kriegs einfach nicht hin.Also ich beschreib mal Schritt für Schritt, wie ich vorgegangen bin:
1:Konsole öffnen und export BROWSER="/usr/bin/firefox" eingeben.Enter,keine Meldung wurde angezeigt.
2.Ich öffne die .cpp Datei und schreibe
getenv("BROWSER"); BROWSER="netscape -raise -remote \"openURL(Puffer)\":lynx";
funktioniert nicht.
3.Versuche etwas anderes und schreibe
hilfe=getenv("BROWSER"); hilfe="firefox -raise -remote \"openURL(Puffer)\":lynx"
Wie gesagt, klappt nicht (compiliert zwar im zweiten Versuch, aber wird dann beim Ausführen automatisch abgebrochen).
Was hab ich nun falsch gemacht?Ich werd aus dieser Browser Variable einfach nicht schlau.
-
Hab noch etwas vergessen.Hab natürlich auch das hier getestet:
BROWSER="netscape -raise -remote \"openURL(%s,new-window)\":lynx" BROWSER="firefox -raise -remote \"openURL(%s,new-window)\":lynx" hilfe="netscape -raise -remote \"openURL(%s,new-window)\":lynx"
-
int main() { char const *browser = getenv("BROWSER"); if(!browser) browser = "..." //... }
-
hilfe="netscape -raise -remote \"openURL(%s,new-window)\":lynx"
int main() { char const *browser = getenv("BROWSER"); if(!browser) browser = "netscape -raise -remote \"openURL(%s,new-window)\":lynx" //...
wenn ich vor dem
browser = "netscape -raise -remote \"openURL(%s,new-window)\":lynx
ein cout mache, dann wird mir nix ausgegeben.Mache ich danach ein cout, wird mir nur "netscape -raise -remote \"openURL(%s,new-window)\":lynx" ausgegeben.Ich denke mal, dass er das export BROWSER="/usr/bin/firefox" in der Konsole nicht angenommen hat.Gibt es noch eine andere Möglichkeit,dies fertzulegen?
-
lege ich mit export Browser='firefox' den standardbrowser fest und mache dan echo $BROWSER wird mir auch firefox als standard Browser angezeigt.Wenn ich die Konsole allerdings wieder schließe und eine neue aufmache und wieder echo $BROWSER eingebe,wird mir ein leeres Feld angezeigt.Irgendwie komisch.
-
nicht komisch. Umgebungsvariablen werden immer nur an Unterprozesse weitergegeben. Wie gesagt, schreib das export einfach in die ~/.profile oder ~/.bashrc
-
Alles klar,hab ich gemacht und es funktioniert.
Man einziges Problem ist jetzt nur noch, dass sich eben der Browser öffnet und die URL, die in Puffer gespeichert ist, aufruft.rüdiger schrieb:
int main() { char const *browser = getenv("BROWSER"); if(!browser) browser = "..." //... }
Aber was muss denn jetzt genau in brwoser="..." rengeschrieben werden?
Ich hab schon soviel ausprobiert aber nichts funktioniert.browser = "netscape -raise -remote \"openURL(%s,new-window)\":lynx" funktioniert nicht, auch in jeglichen von mir veränderten Varianten.
Das ist jetzt nur noch mein einziges Problem.