CopyFileEx unter Win7(x64) macht Probleme
-
Hallo,
ich möchte eine Datei via WINAPI von einem Ordner in den "windows\system32" Ordner verschieben.
Das ganze sieht mit C++ dann so aus:CHAR *Filename = new CHAR[MAX_PATH]; GetSystemDirectory(Filename, MAX_PATH); string str_Pfad = Filename; str_Pfad.append("\\Schnittstelle_Datenaustausch.exe"); GetModuleFileName(NULL, Filename, MAX_PATH); CopyFileEx(Filename, (LPCSTR)str_Pfad.c_str(), NULL, NULL, FALSE, COPY_FILE_FAIL_IF_EXISTS);Nachdem die Funktion aufgerufen wird, taucht aber diese Datei nie in dem Ordner auf. Da ich aber auch als direkten oder indirekten Rückgabewert über GetLastError keinen Fehler bekomme, habe ich mich mal auf die Suche gemacht und habe die Datei auf einmal im "C:\Windows\SysWOW64" gefunden. Ich war etwas erstaunt und bin dann noch mal zur Sicherheit mit der Konsole bis zu "system32" gegangen und habe "von Hand" nach der Datei gesucht. Nichts zu machen...
Das ganze Spielchen passiert auch mit der "CopyFile" Funktion.
Ich verzweifel langsam daran. Kennt jemand eine Lösung?
-
Ok, es scheint an der 64 Bit Umgebung zu liegen
http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx
Das stellt immer noch ein Problem dar, denn die Anwendung wird im Registrierungseditor hinterlegt. Denn sobald der Server startet, soll auch die Anwendung starten.
Gibt es eine Möglichkeit das 32 & 64 Bit kompatibel zu machen?! Denn der Pfad im Registrierungseditor muss ja irgendwie auf die kopierte Datei sein. Und das geht nicht, wenn Windows es nicht dahin kopiert wo ich es brauche.
HKEY Key = NULL; CHAR *Filename = new CHAR[MAX_PATH]; GetSystemDirectory(Filename, MAX_PATH); string str_Pfad = Filename; str_Pfad.append("\\Schnittstelle_Datenaustausch.exe"); GetModuleFileName(NULL, Filename, MAX_PATH); CopyFileEx(Filename, (LPCSTR)str_Pfad.c_str(), NULL, NULL, FALSE, COPY_FILE_FAIL_IF_EXISTS); const char *Pfad = new char[str_Pfad.length()]; Pfad = str_Pfad.c_str(); if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &Key, 0) == ERROR_SUCCESS) { if(Key != NULL) { //long Status = RegQueryValueEx(Key,"Schnittstelle_Datenaustausch",0,0, NULL, NULL); //if(RegQueryValueEx(Key,"Schnittstelle_Datenaustausch",0,0, NULL, NULL) != ERROR_SUCCESS) //{ RegSetValueEx(Key, "Schnittstelle_Datenaustausch", 0, REG_SZ, (LPBYTE)Pfad, (DWORD)str_Pfad.length()); //} } } RegCloseKey(Key);
-
WAS willst Du denn genau machen?
Hast Du eine x86 oder x64 Applikation?
Je nachdem wird die Datei nach system32 oder syswow64 kopiert...
Es macht auch wenig Sinn eine x86 app nach system32 zu kopieren...Also, WAS hast Du für ein Problem? und WAS willst Du genau?