PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sich selber kopieren



Chris K.
13.10.2007, 00:46
ich möchte gerne das sich meine programm von alleine in z.B. den ordner C:\Programme kopiert wie mach ich das es soll funktionieren egal in welchem ordner sich das prog befindet laso wenn es auf dem desktop ist soll es sich nach C:\Programme und auch wenn es z.b. in eigene dateien is soll es sich nach C:\Programme, es soll unabhängig vom speicherort funktionieren und sich selber kopieren.

Kann vllt. jemand helfen

Schlurmann
13.10.2007, 01:20
Falls es um Autostart usw. geht -> Registry. Ansonsten, falls es darum geht, dass du die laufende .exe nicht kopieren kannst, binde sie als Resource ein, extrahiere sie, und kopiere sie mit CopyFile oder einer Kopierfunktion deiner Wahl in den gewünschten Ordner.

(Geht sicher einfacher, aber mir fällt gerade nichts Besseres ein. :))

KillAV
13.10.2007, 09:54
char pfad[500];
char ziel[500];
HMODULE hMe = GetModuleHandle(NULL);
DWORD nRet = GetModuleFileName(hMe, pfad, 256); //Ermittel Pfad der Anwendung
strcpy (ziel,"C:\\Programme\\Test.exe"); //Lege Ziel Pfad Fest
CopyFile(pfad,ziel,0); //Programm wird auf C:\Programme kopiert unter dem Namen Test.exe

zao
13.10.2007, 10:04
Schade dass die C++ FAQ ignoriert wird, aber weil dus bist.

Erst suchen wir das Verzeichnis in dem sich unser zu kopierendes Programm versteckt. Das geht mit GetModuleFileName

also


char Filepath[MAX_PATH+2];
GetModuleFileName(NULL,Filepath, MAX_PATH);

so jetzt haben wir den Pfad IN Filepath gespeichert, der sieht bespielsweise so aus: C:\Programme\dein_programm.exe

wenn man es jetzt in den system32 ordner verschieben will, brauchen wir noch den Pfad. Dafür schreiben wir


char target[MAX_PATH+2];
GetSystemDirectory(target, MAX_PATH);

so jetzt haben wir den Pfad vo system32, der sieht jetzt beispielsweise so aus: C:\WINDOWS\system32
wir brauchen aber mehr, der Pfad muss so aussehen, C:\WINDOWS\system32\dein_programm.exe oder ein x-belibieger Name.
das machen wir so


char* target_+ = strcat(target, "\\dein_programm.exe");

Jetzt haben wir den pfad wie wir ihn brauchen, willst du jetzt aber in einen andere Ordner kopieren kannst du auch sofort einen char array mit dem benötigten pfad anlegen. Jetzt gehts ans kopieren, das machen wir mit CopyFile


Copyfile(Filepath, target_+, false);

achja das false in CopyFile besagt, dass wenn eine datei mit diesem namen schon besteht die datei überschriben wird.


So ne Hilfe bekommt man nicht alle Tage:lol: , das ist schon fast Tutorialfähig.

mfg

Zao

-[RiDER]-
13.10.2007, 11:24
Erst suchen wir das Verzeichnis in dem sich unser zu kopierendes Programm versteckt. Das geht mit GetModuleFileName

also


char Filepath[MAX_PATH+2];
GetModuleFileName(NULL,Filepath, MAX_PATH);

so jetzt haben wir den Pfad IN Filepath gespeichert, der sieht bespielsweise so aus: C:\Programme\dein_programm.exeIm Normalfall haste unter windows (afaik) den programmpfad + dateiname in argv[0].
Korrigiert mich bitte, wenns falsch is.

MfG RiDER

l0dsb
13.10.2007, 11:41
-]Korrigiert mich bitte, wenns falsch is.
Habs jetzt nicht getestet, aber ich denke, das zao von einer Win32-Anwendung ausgeht? Also mit so einem EntryPoint:


int __stdcall WinMain(HINSTANCE__ *Instance, HINSTANCE__ *Previous, char *CmdLine, int CmdShow)
{
//...
return 0;
}
Da gibt es kein argv, wie in einer Konsolenanwendung, und soweit ich weiß ist CmdLine kein 100%iges Äquivalent, sprich dort werden wirklich nur die Parameter gespeichert.

]=-antr4xx-=[
13.10.2007, 15:52
binde sie als Resource einwie geht das?

l0dsb
13.10.2007, 15:56
Manuell mit so ziemlich jedem Ressourceneditor, programmiertechnisch mit der WinApi (siehe MSDN, bzw. Google).

/edit: Stell evtl. noch C++-Source rein, wenn gewünscht.

]=-antr4xx-=[
15.10.2007, 14:05
ja, ist gewünscht, denn von ressourcen habe ich überhaupt keine Ahnung.

l0dsb
15.10.2007, 17:54
]=-antr4xx-=[

Warte, bis der C++-Wettbewerb zu Ende ist, dann hast du einen guten Beispielsource. :P