Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » bugs, die keine sind?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
23.04.2010, 13:46 Uhr
ao

(Operator)



Zitat:
damit ist klar, dass
_wexecl(sysdir, L"uninst", L"pass", NULL);
den gewünschten parameter "pass" als erstes Argument übergibt...

Du hast weiter oben was von tWinMain geschrieben - rufst du da eine MFC-Applikation als Kindprozess?

Die WinMain von MFC hat ein anderes Command-Line-Modell als Standard-C-Programme, d.h. die Argumente müssen vor der Übergabe an die WinMain in einem String zusammenkopiert werden. Vielleicht geht dabei was schief, warum auch immer.

Kann es mit Ansi-Character und Wide-Character zu tun haben?

Versuch doch mal, eine Standard-C-Applikation als Kindprozess zu starten, deren main-Funktion so aussieht:

int main (int argc, char * argv[]);

Es gibt hier ein Beispielprogramm, das lege ich dir mal ans Herz: http://msdn.microsoft.com/en-us/library/aa246821


Zitat:
RemoveDirectory jedoch gibt Fehlercode 3 zurück (ERROR_PATH_NOT_FOUND). Das kann aber nicht sein, denn ... dieser pfad existiert definitiv vor dem funktionsaufruf!


"Pfad nicht gefunden" heißt nicht "Pfad existiert nicht". Es sind noch andere Ursachen möglich, Tommix hat eine genannt.

Dies ist mein letzter Versuch, aus dem Kaffeesatz zu lesen. Das nächste Mal bitte einen kompilierbaren Quellcode, der den Fehler demonstriert, und nicht ein paar einzeilige Fragmente.

ao

Dieser Post wurde am 23.04.2010 um 13:47 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
23.04.2010, 16:45 Uhr
maestro6



Mittlerweile hat sich herausgestellt: Wenn man die Exedatei (A mit dem Elternprozess) von einem anderen Verzeichnis als c:\program files\processmanager aus startet, kann man dieses löschen. RemoveDirectory wird aber von einem seperaten prozess (B) in c:\windows\temp
aufgerufen und zu dem Zeitpunkt befindet sich der aufrufende prozess (A) nicht mehr im speicher, das verzeichnis ist leer und auch nicht gesperrt...

zum ausprobieren:
A: soll B erzeugen:
CopyFile(L"c:\program files\A.exe", L"c:\windows\temp");
execl(L"c:\windows\temp\B.exe", NULL);
PostQuitMessage(0); // dazu kommt es nicht mehr, weil execl den laufenden prozess (A)zerstört.

B: soll das Verzeichnis, in dem sich auch A befindet, löschen:
DeleteFile(L"c:\program files\processmanager\A.exe");
DeleteFile(L"c:\program files\processmanager\B.exe");
und anschließend:
RemoveDirectory(L"c:\program files\processmanager");

Welchen Wert muss man denn in die Registry (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Session Manager\) eintragen, um das Verzeichnis beim nächsten Start vom Betriebssystem löschen zu lassen??

Dieser Post wurde am 23.04.2010 um 17:22 Uhr von maestro6 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
23.04.2010, 18:45 Uhr
ao

(Operator)


Also:

A kopiert sich selber von program files nach windowstemp.
In windowstemp gibts ein B, das wird als Prozess gestartet.

B löscht ein A, aber nicht das von oben, sondern das in program files processmanager
Neben diesem A liegt ein weiteres B, das wird ebenfalls gelöscht.
Abschließend wird das ganze Verzeichnis entfernt.

Hab ich das so richtig verstanden?

Und welches ist das Working-Directory während dieser ganzen Aktion? Insbesondere, während B läuft?

Und ich bin immer noch der Ansicht, die Backslashes müssten doppelt sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
23.04.2010, 20:14 Uhr
maestro6




Zitat von ao:
Also:A kopiert sich selber von program files nach windowstemp.
In windowstemp gibts ein B, das wird als Prozess gestartet.


ne, A kopiert B und startet B;


Zitat von ao:

B löscht ein A, aber nicht das von oben, sondern das in program files processmanager
Neben diesem A liegt ein weiteres B, das wird ebenfalls gelöscht.
Abschließend wird das ganze Verzeichnis entfernt.


Genau! Das kopierte B löscht A+B. Und B hat kein bestimmtes Working-Directory, sondern es nimmt das aktuelle...

Die Backslashes wären ja auch doppelt...aber hat sonst keiner einen Rat?

Dieser Post wurde am 23.04.2010 um 20:17 Uhr von maestro6 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
23.04.2010, 22:27 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von maestro6:


C++:
CopyFile(L"c:\program files\A.exe", L"c:\windows\temp");
execl(L"c:\windows\temp\B.exe", NULL);
PostQuitMessage(0); // dazu kommt es nicht mehr, weil execl den laufenden prozess (A)zerstört.




C++:
DeleteFile(L"c:\program files\processmanager\A.exe");
DeleteFile(L"c:\program files\processmanager\B.exe");


und anschließend:

C++:
RemoveDirectory(L"c:\program files\processmanager");




Wenn das so im Code steht, ist es kein Wunder, dass es nicht funktioniert. Beschwert sich dein Compiler nicht über fehlerhafte Escape-Sequenzen?

Jedenfalls sind die Backslashes so nicht in Ordnung, du musst sie escapen. Etwa

C++:
CopyFile(L"c:\\program files\\A.exe", L"c:\\windows\\temp");


Alternativ kannst du auch einfache Schrägstriche verwenden:

C++:
CopyFile(L"c:/program files/A.exe", L"c:/windows/temp");


Das ist auch eine gute Angewohnheit, wenn man in der Zukunft plattformunabhängige Software schreiben müssen könnte.

Siehe dazu auch http://msdn.microsoft.com/en-us/library/h21280bw%28VS.80%29.aspx
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: