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 ]
000
22.04.2010, 11:52 Uhr
maestro6



Also manchmal fragt man sich, ob microsoft einen mit seinem visual studio verarschen will...
Es kann z.B. nicht sein, dass RemoveDirectory(...) von vs aus gestartet ein leeres verzeichnis löscht, aber es stehen läßt wenn man die exe-datei seines programms ausführt..
dann wäre da noch wexecl(...), das einen prozess starten soll. das tut es auch brav, will aber auf teufel komm raus keinen parameter übergeben.
woran könnte das denn liegen leute?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.04.2010, 12:58 Uhr
Tommix



Hallo,
die größte Fehlerquelle befindet sich zumeist zwischen Bildschirm und Stuhllehne . Wenn Du den Code postest, der nicht läuft, kann Dir sicher eher jemand helfen.
Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.04.2010, 13:20 Uhr
maestro6



naja, viel code gibt's da nicht:

RemoveDirectory(str_tmp)); // str_tmp = "cprogram files\processmanager"

str_tmp enthält dabei den Pfad. Es nützt auch nichts zu warten, bis das Verzeichnis physikalisch leer gelöscht ist, wie gesagt, beim Debugen funktioniert's.

und

_wexeclp(sysdir, L"pass"); //sysdir = "cwindows\temp\uninst.exe"

'Elternprozess' erzeugt damit den Kindprozess, von dem
"pass" als parameter über lpCmdLine (LPCSTR) in tWinMain(...)
ausgelesen werden soll. lpCmdLine ist aber leer ("")!

"die größte Fehlerquelle befindet sich zumeist zwischen Bildschirm und Stuhllehne" wieso leuchtet mir das immer später ein ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.04.2010, 13:33 Uhr
ao

(Operator)


Hast du die Pfade wirklich mit einfachem Backslash im Sourcecode stehen?

Und im Fall von RemoveDirectory: Welchen Pfad hat die Exe-Datei, die gerade ausgeführt wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.04.2010, 13:39 Uhr
ao

(Operator)


Und so wie ich das verstehe, muss execlp anders aufgerufen werden, mit einem abschließenden NULL als letztem Argument.

Lies doch mal hier nach:
http://msdn.microsoft.com/en-us/library/aa246821(VS.60).aspx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.04.2010, 14:51 Uhr
maestro6



also die Exe Datei befindet sich in cprogram files\processmanager...
falls du das meinst, dass die datei gesperrt wird: nein, weil aus einem anderen
pfad (windows\temp) die exe datei geladen wird, um das verzeichnis eben löschen
zu können...(und backslashe stimmen, bedenke debugmodus)
Und auch wenn sich beide Exe Dateien im selben Pfad befinden funktioniert die Übergabe nicht (naja, man kann's ja in dem fall probieren).
Wenn man aber VS die argumente übergeben läßt, klappt es.
Ich habe auch schon vergeblich NULL als letztes Argument hergenommen.

Ein Programmierer ohne Debugger ist ein blindes Huhn.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.04.2010, 15:25 Uhr
ao

(Operator)



Zitat:
also die Exe Datei befindet sich in cprogram files\processmanager...

Die MSDN Library sagt:
http://msdn.microsoft.com/en-us/library/aa365488(VS.85).aspx

Zitat:
RemoveDirectory Function
Deletes an existing empty directory.


Wenn das Directory eine Exe-Datei enthält, ist es nicht empty.
RemoveDirectory gibt übrigens einen Rückgabewert. Hast du den schon mal untersucht?

Weiterhin steht in der MSDN-Library:

Zitat:
The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.

Das heißt, solange das Verzeichnis noch im Windows-Explorer offen ist (oder ähnlich) wird es ebenfalls nicht gelöscht.


Zitat:
falls du das meinst, dass die datei gesperrt wird

Ja, darauf wollte ich hinaus. Aber wahrscheinlich ist einfach das Verzeichnis nicht leer.


Zitat:
und backslashe stimmen, bedenke debugmodus

verstehe nicht telegrammstil - stop -


Zitat:
Ich habe auch schon vergeblich NULL als letztes Argument hergenommen.

Zeig bitte die Quellcodes, die du vergeblich versucht hast. Welche Errorcodes sind aus execlp herausgekommen?

Dieser Post wurde am 22.04.2010 um 15:29 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.04.2010, 16:10 Uhr
Tommix



Was noch ein Kandidat wäre, sind die Zugriffsrechte - zumindest unter Vista. Wenn Du die IDE als Administrator gestartet hast, kannst Du mit dem Debugger im Programmverzeichnis rumpfuschen und auf der "normal" gestarteten Konsole oder vom Explorer aus nicht.
- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.04.2010, 11:17 Uhr
maestro6



"The first argument is the command or executable file name, and the second argument should be the same as the first. It becomes argv[0] in the executed process. The third argument is the first argument, argv[1], of the process being executed. "

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

RemoveDirectory jedoch gibt Fehlercode 3 zurück (ERROR_PATH_NOT_FOUND). Das kann aber nicht sein, denn in
RemoveDirectory(str_tmp);
ist str_tmp vom Typ WCHAR[] = "cprogram files\processmanager" und dieser pfad
existiert definitiv vor dem funktionsaufruf!

Ein Programmierer ohne Debugger ist ein blindes Huhn.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.04.2010, 13:35 Uhr
Tommix



Kann ich nicht nachvollziehen. Bei mir geht

C++:
int main(void)
{
    wchar_t dir[] = L"C:\\program files\\xy";
    BOOL b = RemoveDirectory(dir);
    DWORD err = GetLastError();
    wprintf(L"%d %d\n", b, err);
    return 0;
}


auch stand-alone von der Konsole.
- Tommix
 
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: