Probleme mit ParamStr() und überhaupt ...
-
Hallo Leute ... ich versuche ein kleines Programm zu schreiben, dem ich 2 Params übergebe. Diese Parameter beinhalten zwei Pfade. Wenn ich das ganze kompilieren möchte, meckert er natürlich über die nicht existenten ParamStr. Deswegen habe ich schon versucht, diese einer Variable zu zu ordnen und dann auf existenz abzufragen. Das Programm soll dann einfach nur durch ein PHP Script mit exec() aufgerufen werden und 2 Parameter mit übergegeben bekommen.
Dann soll es alles von A nach B kopieren, eine MessageBox ausgeben und das wars. Aus diesem Grund habe ich auch in der WinMain "//Application->Run();" gesetzt, so dass kein Form mehr nach der MessageBox auftaucht. Ihr merkt ich habe noch wenig Ahnung. Ist bestimmt auch alles unsauber gemacht. Wäre für Tipps echt dankbar.
//--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); //Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { AnsiString Param1 = ParamStr(1); AnsiString Param2 = ParamStr(2); if isset (Param1!=0 && Param2!=0) { if(MoveFiles(Param1, Param2)) ShowMessage("Ausführung erfolgreich !"); else ShowMessage("Fehler aufgetreten !"); } else { ShowMessage("Es wurden keine Parameter übergeben!"); } } //--------------------------------------------------------------------------- int TForm1::MoveFiles(AnsiString slSourceDir, AnsiString slTargetDir) { //TODO: Add your source code here SHFILEOPSTRUCT sh; //ZeroMemory(&sh, sizeof(sh)); sh.hwnd = NULL; slSourceDir+='\0'; sh.pFrom = slSourceDir.c_str(); slTargetDir+='\0'; sh.pTo = slTargetDir.c_str(); sh.fFlags = FOF_NOCONFIRMATION; sh.wFunc = FO_COPY; // Durchzuführende Operation sh.hNameMappings = NULL; sh.lpszProgressTitle = "test"; return SHFileOperation(&sh); }
-
a) Wenn du keine Form brauchst (wozu auch), warum erstellst du dann ein GUI-Projekt statt eines Konsolen-Projektes?
b) Warum erledigst du das Verschieben nicht gleich per PHP? Soweit ich weiss gibt es dort reichlich Funktionen zur Dateimanipulation.
c) "Dann meckert er" ist keine ausreichende Fehlermeldung oder Problembeschreibung.
-
a) Wenn du keine Form brauchst (wozu auch), warum erstellst du dann ein GUI-Projekt statt eines Konsolen-Projektes?
Antowort:
Habe ich jetzt gemacht, also eine Konsolenanwendung.b) Warum erledigst du das Verschieben nicht gleich per PHP? Soweit ich weiss gibt es dort reichlich Funktionen zur Dateimanipulation.
Antwort:
Also was PHP angeht, bin ich richtig fit. PHP ist serverbasierend und kann für sehr viele Zwecke benutzt werden. Aber es ist nicht die Aufgabe von PHP mir Verzeichnisse zu kopieren. Es handelt sich um Datenmnängen von über einem Gig. Bei PHP ist mir das zu unsicher. Timeouts, Abbruch des Scripts, etc. Deswegen lieber ein C++ Programm, dem ich von PHP mit exec die PFade übergebe.c) "Dann meckert er" ist keine ausreichende Fehlermeldung oder Problembeschreibung.
Antwort:
Da hast du Recht.Also aktueller Stand der Dinge:
Ich habe eine Konsolenanwendung erstellt.Diese hat folgenden Code:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { AnsiString slSourceDir = argv[1]; AnsiString slTargetDir = argv[2]; SHFILEOPSTRUCT sh; //ZeroMemory(&sh, sizeof(sh)); sh.hwnd = NULL; slSourceDir+='\0'; sh.pFrom = slSourceDir.c_str(); slTargetDir+='\0'; sh.pTo = slTargetDir.c_str(); sh.fFlags = FOF_NOCONFIRMATION; sh.wFunc = FO_COPY; // Durchzuführende Operation sh.hNameMappings = NULL; sh.lpszProgressTitle = "test"; SHFileOperation(&sh); return 0; } //---------------------------------------------------------------------------Wenn ich slSourceDir und slTargetDir durch Pfade ersetze, zum Beispiel d:\\test und e:\\test, kopiert er wunderbar den Inhalt von A nach B.
Wenn ich jetzt aber argv verwende, was ja später meine Pfade beinhalten soll, kommt die Fehlermeldung:
Datei kann nicht kopiert werden: Der angegebene Dateiname ist ungültig oder zu lang. Geben Sie einen anderen Dateinamen ein.Klar, weil die Argumente leer sind. Also muss ich vorher eine Abfrage machen, ob diese existieren, oder?
In PHP gibts da einige Möglichkeiten. isset, !empty, etc. Wie kann ich in C++ fragen, ob die Variable überhaupt existiert?
Hoffe auf eure Hilfe, danke im Voraus.
-
Schau dir mal den Parameter "argc" deiner main-Funktion an. Was könnte der möglicherweise bedeuten?
-
OK, argc dürfte die Anzahl der übergebenen Parameter sein ;o) arg count ... ok, sorry, dass war mein Fehler.
Jetzt aber noch eine andere Frage, die bestimmt genau so genial ist ;o) ich bekomme keine EXE erstellt von meinem Konsolenprogramm. Kann es zwar ausführen mit F9, aber ich bekomm wie gesagt keine EXE erstellt.
Schlagt mich nicht, wenns wieder an mir liegt.
-
sergio schrieb:
Aber es ist nicht die Aufgabe von PHP mir Verzeichnisse zu kopieren. Es handelt sich um Datenmnängen von über einem Gig. Bei PHP ist mir das zu unsicher. Timeouts, Abbruch des Scripts, etc.
Was ist denn deiner Meinung nach "die Aufgabe von PHP"?
Auch in PHP kann man Fehlerbehandlung etc. realisieren.Ausserdem bist du mit deinem Programm auf Windows-Server festgelegt und negierst damit einen der Hauptvorteile von PHP. Da du API-Funktionen verwendest kannst du den Code noch nichtmal durch neukompilieren für Linux o.ä. fit machen, sondern müsstest für andere Plattformen alles neuschreiben.
Was deine Exe betrifft, die wird mit Sicherheit erzeugt, sonst würde das Programm auch per F9 nicht starten.
-
Ja, das mit der Exe war mein Fehler. Klar ist sie da, wurde nur wo anders gespeichert. Eigentlich möchte ich mich nicht rechtfertigen, warum ich für eine Kopieraktion im Gig Bereich lieber ein Programm benutze, als PHP, aber ich machs mal ansatzweiße ...
Ich brauche eine Statusleiste mit Restzeit, aktueller Datei und einem Statusbalken. In PHP habe ich Hindernisse wie Timeouts, etc. und das könnte ich jetzt als so weiter machen.
Aber ich habe den Thread geöffnet um Hilfe bei meiner Frage zu bekommen und nicht um mich über PHP zu unterhalten ;o)
Was die plattformunabhängigkeit angeht. Das gesamte, was hauptsächlich in PHP geschrieben ist, läuft in einem 150000 Euro Windows Netzwerk. Also ist in diesem Fall Linux/Unix egal.
Naja, jetzt aber genug. Ich habe das was ich brauche jetzt fertig. Wens interessiert ...
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { if(argc == 3) { // Überprüfe wieviele Argumente übergeben wurden. 1. Pfad, 2. Quellpfad, 3. Zielpfad AnsiString slSourceDir = argv[1]; // Zuweisung des Arguments einer Variable AnsiString slTargetDir = argv[2]; SHFILEOPSTRUCT sh; ZeroMemory(&sh, sizeof(sh)); sh.hwnd = NULL; slSourceDir+='\0'; // doppelte Nullterminierung sh.pFrom = slSourceDir.c_str(); slTargetDir+='\0'; sh.pTo = slTargetDir.c_str(); sh.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI; // Keine Fehler- und Frageausgaben sh.wFunc = FO_COPY; // Kopiert die Verzeichnisse sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if(!SHFileOperation(&sh)) { ShowMessage("KOPIERT"); } else { ShowMessage("FEHLER!"); } } else { ShowMessage("Zu wenig Parameter übergeben!"); } return 0; } //---------------------------------------------------------------------------
-
sergio schrieb:
Eigentlich möchte ich mich nicht rechtfertigen
Du brauchst dich nicht zu rechtfertigen, schliesslich geht es hier nicht um Anschuldigungen sondern lediglich um Unverständnis (meinerseits).
Ich brauche eine Statusleiste mit Restzeit, aktueller Datei und einem Statusbalken.
Wozu, wenn ich fragen darf? Dein Programm läuft doch auf dem Server, da sieht doch nie jemand die Fortschrittsanzeige!?
-
Dann habe ich vielleicht was falsch geschrieben oder du falsch verstanden, wie auch immer. Das worum es grad geht, ist für die Benutzer, bzw. Angestelten. Aus diesem Grund ist der Balken des Fortschritts am besten. Klar könnte man mit PHP auch viel machen, aber guck dir den C++ Code an. Das ist gar nichts im Gegensatz zu PHP mit der Funktionalität.
Wollte dich auch nicht anmachen und rechtfertigen war natürlich nicht so krass gemeint. Ersetze rechtfertigen mit darauf Bezug nehmen ;o)
-
sergio schrieb:
Das worum es grad geht, ist für die Benutzer, bzw. Angestelten.
Das verstehe ich nicht. Du lässt auf jedem Anwenderrechner lokal PHP laufen?
Wäre es da nicht sinnvoller, gleich eine "normale" Fenster-Anwendung, z.B. mit dem BCB zu schreiben?Entschuldige meine Neugier, aber bin einfach ... ähhh ... neugierig.

Und wenn ich jemanden eine Lösung verfolgen sehe, die ich für stark suboptimal halte, dann lässt mir das keine Ruhe.
-
Nein, klar habe ich einen Server ... IIS + PHP + MySQL.
Die Benutzer rufen alles vom Server ab. PHP eben. Das kleine Programm wird dann von dem PHP Script mit exec aufgerufen und kopiert mir die ausgewählten und per Parameter übergebenen Verzeichnisse.
-
sergio schrieb:
Das kleine Programm wird dann von dem PHP Script mit exec aufgerufen und kopiert mir die ausgewählten und per Parameter übergebenen Verzeichnisse.
Ja aber doch nur auf dem Server!? D.h. es werden ausschliesslich Dateien auf dem Server kopiert bzw. verschoben, und auch der Statusdialog wird lediglich auf dem Server angezeigt.
Es wäre mir neu, dass sich per exec(), system() usw. Programme auf dem Client ausführen lassen.Vielleicht kannst du ja mal kurz andeuten, wofür dein PHP-Programm eigentlich gedacht ist. Soll das so eine Art Server-Fernbedienung per Webinterface sein, ala Webmin oder Confixx?
-
Man, entschuldige. Momentan häng ich auch ziemlich. Klar hast du recht. PHP ist serverseitig und führt das Programm auf dem Server aus, ohne das der Client die Ausgabe sieht. OK, dass muss ich dann anders machen. Dann mach ich einfach eine interne Ausgabe, die ich dann auf dem Server auslese und dem Client dann auf der Site ausgebe.
Nein, es ist nicht so wie du denkst. Also ich hab den ganzen Kram auf dem Server. Die Clients haben eine Oberfläsche
auf der Sie lokale Verzeichnisse auswählen können. Diese werden dann als Quelle genutzt. Die ausgewählten Verzeichnisse werden dann bisher übercmd = "xcopy \\"\\\\\\reception\$path\" \"\\\192.168.240.2\\verzeichnis\".dir."\\\\\" /EVHRY"; copy = exec($cmd , $list, $return);
xcopy kopiert. Da mir das mit dem xcopy aber zu unsicher ist, wollte ich eine eigene exe schreiben.
So das ist der Stand der Dinge.
P.S. In $list steht ja die Ausgabe von xcopy ... was er kopiert hat. So werde ich dass dann auch mit meiner exe machen. Trotzdem bräuchte ich irgendwie eine Anzeige für den User.
Eine Idee?