C Programm kopieren unter XP schlägt fehl

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
Ich mal wieder...

Mein Problem ist folgendes: Ich programmiere gerade ein Programm, das sich selbst in den Autostart kopieren soll. Später werde ich noch eine Abfrage einbauen, ob es bereits vorhanden ist, und außerdem den eigentlichen Programmteil noch einbauen, aber im Moment geht es mir primär nur um das kopieren in den Autostart. Dazu hatte ich folgenden Code geschrieben bzw. mein eigenes Grundgerüst mit Codeschnipseln aus dem Netz kombiniert.

Mit dem Build und der späteren Abfrage ob Build < 6000, will ich überprüfen, ob XP oder Vista verwendet wird, um den entsprechend richtigen Zielpfad zum Autostart zu verwenden.

Bei Vista habe ich folgendes Problem:
So, wie ich mir das bis jetzt ausgemalt habe, sollte durch strcat der 1. Pfadteil mit dem ausgelesenen Usernamen verbunden werden, danach der 1. Pfadteil + Username mit dem 2. Pfadteil. Zuletzt wird der fertige Pfad noch an "fopen(Pfad, "wb");" geschickt. Wenn ich das Programm (unter Vista) ausführe, wird jedoch gar nichts in den Autostart kopiert.

Bei XP folgendes Problem:
Sobald ich das Programm starte, gibt es mir nur "M" aus, kurz darauf meldet Windows, dass ein Problem festgestellt wurde und das Programm beendet werden muss. Woher das "M" kommt weiß ich, denn wenn man den kompilierten Code mal mit dem Texteditor öffnet, ist es das erste Zeichen dort. Doch wieso können nicht die weiteren Zeichen auch kopiert werden, immerhin klappt es unter Vista (wenn ich mal nicht meinen eigenen Autostartpfad-Generierer, sondern einen festen Pfad verwende)...

Was mich auch interessieren würde ist, wieso ich unbedingt byteweise ("wb") kopieren muss und wenn ich nur mit "w" kopieren lasse die kopierte Datei bloß auf 4.096kB kommt.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void)
{
	OSVERSIONINFO osinfo;
	osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	int Build = osinfo.dwBuildNumber;

	FILE *Quelle, *Ziel;
	int puffer;
	Quelle = fopen("copy.exe", "rb");
	if(Build < 6000)
		Ziel = fopen("C:/Dokumente und Einstellungen/All Users/Startmenü/Programme/Autostart/copy.exe", "wb");
	else
	{
		DWORD nSize;
		char user_name[255];
		nSize = sizeof(user_name);
		GetUserName(user_name, &nSize);
		char Pfad[] = "C:/Users/", Pfad1[] = "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Autostart/copy.exe";
		strcat(Pfad, user_name);
		strcat(Pfad, Pfad1);
		Ziel = fopen(Pfad, "wb");
	}
	while( (puffer=fgetc(Quelle)) != EOF)
	{
		putchar(puffer);
		fputc(puffer, Ziel);
	}

	fclose(Quelle);
	fclose(Ziel);
	return EXIT_SUCCESS;
}
 
Wie wäre es denn mal zu prüfen ob Ziel überhaupt gültig ist nach fopen? Das wird wohl nicht der Fall sein.
Und sehr intelligent bye-weise zu kopieren *kopfschüttel*

Zudem sollte man die Pfade nicht fest einprogrammieren, dazu gibt's extrea Win32-API-Funktionen...
 
Blitzmerker schrieb:
Warum machst du eigentlich es nicht einfach mit einer befehlszeile a la "copy copy.exe %USER%\Autostart"?
UInd wegen dem hässlichen Fenster, einfach sich mal mit ShellExecute auseinandersetzten, zum Beispiel mit SW_FORCEMINIMIZE.

Das Problem ist ja nicht das kopieren in einen fremden Ordner, das klappt. Das Problem ist unter Vista, dass ich wohl irgnedetwas beim Zusammensetzen der 3 Stringteile falsch gemacht haben muss, wodurch der Autostartpfad nicht richtig gesetzt wird. Bei XP komme ich ja erst gar nicht so weit, dass das Programm kopiert wird.

Das Problem müsste also irgendwo hier liegen:
Code:
               DWORD nSize;
		char user_name[255];
		nSize = sizeof(user_name);
		GetUserName(user_name, &nSize);
		char Pfad[] = "C:/Users/", Pfad1[] = "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Autostart/copy.exe";
		strcat(Pfad, user_name);
		strcat(Pfad, Pfad1);
		Ziel = fopen(Pfad, "wb");

Unter XP stört mich Momentan nicht das Fenster, das die kopierten Zeichen anzeigt, sondern die Tatsache, dass nur "M" angezeigt wird und danach gesagt wird, dass das Programm beendet werden muss.

1668mib schrieb:
Wie wäre es denn mal zu prüfen ob Ziel überhaupt gültig ist nach fopen? Das wird wohl nicht der Fall sein.
Und sehr intelligent bye-weise zu kopieren *kopfschüttel*

Zudem sollte man die Pfade nicht fest einprogrammieren, dazu gibt's extrea Win32-API-Funktionen...

Dass ich selbst nicht weiß, wieso ich byteweise kopieren muss und wieso nur 4096kB kopiert werden, wenn ich es ohne den Zusatz "b" mache, habe ich bereits gesagt. Ob der Pfad fest einprogrammiert ist oder nicht, ist mir egal, den unter XP treffe ich mit dem angegebenen Pfad 100%ig den Autostart, unter Vista auch, würde mein Zusammensetzen denn klappen.
 
Zuletzt bearbeitet:
Den wichtigsten Teil der Frage haste unbeantwortet gelassen.
Wieso prüfst du Ziel nicht auf Gültigkeit nach fopen?
 
Wieso sollte Ziel nicht gültig sein? Der Pfad existiert 100%ig, die Datei konnte 100%ig bereits auf einem anderen Pfad erstellt werden -> Es muss am fehlerhaften Zusammensetzungsverfahren des Pfads liegen.

edit: Es liegt an der Buildabfrage, da kommt 0 raus. Wie bekomme ich die jetzt so hin, dass sie funktioniert?

edit2: Ich habe "GetVersionEx(&osinfo); " unter " osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); " eingefügt, war anscheinend ein wichtiger Teil, den ich vergessen habe zu kopieren. Jetzt stimmt der Build.
 
Zuletzt bearbeitet:
lol, du holst dir auch nirgends die aktuellen OS-Informationen, du machst ja nur ne Variable...

Win32-API ist das große Stichwort.
 
Unter Vista klappt es immer noch nicht, wobei ich glaube, dass das an meinem Pfad zum Autostart liegt, da ist ein Zeichen drin, das nicht richtig erkannt wird...

Ich werde mir jetzt schnell einen 2. Benutzeraccount ohne Sonderzeichen erstellen.

Unter XP werde ich es gleich auch versuchen, werde dann editieren falls noch etwas nicht klappt.

edit: Unter XP hat es jetzt geklappt, das Problem mit Vista war, dass der Pfad nicht "Autostart" sondern "Startup" heißen muss...
 
Zuletzt bearbeitet:
Die Win32 API hätte dir das richtige Verzeichnis geliefert :<
 
Bitte auf keinen Fall einfach fix definierte Pfade verwenden. Wer sagt denn, dass das System auf C: installiert ist? Wer sagt denn, dass das Userprofil überhaupt auf der Systempartition liegt. Das kann entweder anders lauten (ich hatte eine Zeit lang C:\Setttings bei XP). Weiters haben vor allem größere Firmen ein servergespeichertes Userprofil. Das liegt dann überhaupt ganz wo anders. Zumindest das Userprofil musst du dir unbedingt auslesen (%userprofile%). Es kann aber auch gut sein, dass der Autostart Ordner auch nicht fix ist (Google sollte helfen).

Das sind dann so wunderschöne Programme, die nicht laufen. Einmal habe ich schon extra einen USB Stick geholt, dass ich ein C: Laufwerk für temporäre Dateien hatte:D
 
Zurück
Oben