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.
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;
}