I am currently working on WAtomic. It saves its settings to C:\Dokumente und Einstellungen\username\Anwendungsdaten\WAtomic which I think can be correctly replaced by %APPDATA%/WAtomic cause although I dont know anything about programming, I found one sourcefile that says:
unit sh_fun; { ------------------------------------------------------------------ WATOMIC - Windows(c) KAtomic clone Copyright (C) 2005 Federico Blaseotto (ironfede) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------ } interface //This function prepares the execution environment //of WAtomic storing ini filenames and getting the //correct Application Directory path in order //to allow WAtomic running in multiuser mode (e.g w2k-ntfs) function InitEnv:boolean; var HS_INI_FILENAME:string; MAIN_INI_FILENAME:string; implementation uses shellAPI,shlObj,ActiveX,Windows,Forms,SysUtils; //------------------------------------------------------------------------------ //It's a caller job cleaning the allocator procedure FreePidl(pidl: PItemIDList); var allocator: IMalloc; begin if Succeeded(SHGetMalloc(allocator)) then begin allocator.Free(pidl); {$IFDEF VER90} allocator.Release; {$ENDIF} end; end; //------------------------------------------------------------------------------ //Get the application data directory to write high scores function GetAppDataPath(var sPath: string): Boolean; var pidl: PItemIDList; buf: array[0..MAX_PATH] of char; begin result := false; if Succeeded(ShGetSpecialFolderLocation( Application.Handle, CSIDL_APPDATA, pidl )) then begin if ShGetPathfromIDList(pidl, buf) then begin result := true; sPath := string(buf); end; FreePidl(pidl); end; end; //------------------------------------------------------------------------------ function InitEnv:boolean; var AppPath:string; begin try if not GetAppDataPath(AppPath) then begin Result:=FALSE; Exit; end; if not DirectoryExists(AppPath+'\WAtomic') then Mkdir(AppPath+'\WAtomic'); MAIN_INI_FILENAME :=AppPath + '\WAtomic\WAtomic.ini'; HS_INI_FILENAME :=AppPath + '\WAtomic\hs.ini'; Result:=TRUE; except Result:=FALSE; end; end; //-------------------------------- // ironfede@users.sourceforge.net //-------------------------------- end.
ehich I interpreted as %APPPDATA%/WAtomic.
But adding
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("APPDATA", "$SETTINGSDIRECTORY").r0'
to the launcher seems to have no effect.
I tried adding
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("USERPROFILE", "$SETTINGSDIRECTORY").r0'
but that resulted in the settings being saved into \WAtomicPortable\Data\settings\Anwendungsdaten\WAtomic
Can anyone help me?
https://portableapps.com/node/12739
I think that MIGHT help....
If you don't understand it, just give me the application name, and the setting it creates, and I' try to make it for you
(and to explain it step by step ;))
Put this before it launches
Then put this after it exits
You might want to do a
Do this so if the user already has that folder, then you can tell it to rename it to like appname_Backup then at the end change it back to the original name. If you need more help on the backing up part, check out Ares Portable I released a while back.
Remember to change the above APPNAME to WAtomic
An eye for an eye makes the whole world blind.
Mahatma Gandhi,
Indian political and spiritual leader (1869 - 1948)
I want to do it by redirecting the Appdata variable but it doesnt seem to respond to it (although the source file suggests it afaict).
The App in question is WAtomic.
Of course I could do it by copying files but redirecting the variable is cleaner and faster.
If you could figure out how to do it would be great.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
Soduku redirects. I think its doing what it should-isn't it?
Too many lonely hearts in the real world
Too many bridges you can burn
Too many tables you can't turn
Don't wanna live my life in the real world
I think Soduku creates the settings, then copies the setting to the "data" folder on your USB and then deletes the settings, it created on the system.
You have to be very good with NSIS if you want the files to be redirected straight to your USB instead of being saved on the computer first...
I wish I was that good, but I still consider myself a begginner in Nsis, I just mostly know the basics. I plan on learning more about it this summer. BTW does anyone know how to do that, where you can make it just save to the usb instead of moving files. I think im gonna start to look into scripts that might do this
An eye for an eye makes the whole world blind.
Mahatma Gandhi,
Indian political and spiritual leader (1869 - 1948)
The problem is that this program actually gets the APPDATA path the correct way by calling the SHGetSpecialFolderLocation function (also correct to use SHGetFolderPath). The redirection that many PApps do, works by modifying the PATH environment variables. I don't believe this has any effect on the above function, which is why your redirection fails. (I'm going to test this to be sure.)
You're probably out of luck with the PATH modify method, so you'll have to manually copy files.
for your clear answer. Then I'll have to take the "copy files" way.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
I tested and confirmed. The currently correct function for this is SHGetFolderPath (SHGetSpecialFolderLocation is deprecated, but the results are the same).
Another option, if you really wanna go there, is to recompile the source to use environment variables to get the path. Then you could do your redirection.
I dont know anything about compiling/programming and dont want to do something wrong.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
I did a little more testing, with some mixed results. After re-reading your first post, you might wanna just stick with redirecting USERPROFILE. It seems that SHGetSpecialFolderLocation builds the return for CSIDL_APPDATA from the USERPROFILE environment variable. So while you can't change the 'Application Data\WAtomic' portion of the path, you can at least change the portion before that (the USERPROFILE portion).
I tried this with the SHGetFolderPath function, and it fails (returns blank) if the target folder doesn't exist (ie you changed the USERPROFILE env var before calling the function), or you don't instruct the function to create the folder (flag CSIDL_FLAG_CREATE). It seems the SHGetSpecialFolderLocation function behaves the same way (but there's no flag to force the folder creation).
Sorry if that's a bit of a read, but several devs have run into this roadblock, so it bears understanding.
I'm confused.
So if I create the folder first it does work with redirecting the Appdata variable?
Or only with userprofile?
I know that redirecting the userprofile thing works but (as mentioned in the first post) it creates
\WAtomicPortable\Data\settings\Anwendungsdaten\WAtomic
which is the german version of\WAtomicPortable\Data\settings\Application Data\WAtomic
. So if I have the german version I guess it wont work on a foreign machine...?Thats why I am reluctant to reidrecting userprofile and would rather copy the files instead.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
So if I create the folder first it does work with redirecting the Appdata variable?
Or only with userprofile?
He's saying it'll only work with redirecting USERPROFILE, because SHGetSpecialFolderLocation() ignores the APPDATA environment variable.
So if I have the german version I guess it wont work on a foreign machine...?
Don't know the answer to this one, but if your guess is correct (which is my guess), you could actually Rename the "Application Data" portion of the path as necessary prior to use. Basically,
would leave $R0 with the current system's name for that directory. If you saved the last-used directory name in an INI file (like FFP and TBP do with last drive letter), you'd be able to rename the "Application Data" portion as needed to make the local system find it. It would require a bit more logic than copying, but it would be more fault-tolerant and likely much faster.
Thats why I am reluctant to reidrecting userprofile and would rather copy the files instead.
Yeah, that's easiest to do. But when someone perfects the redirect method it'll work better for everyone.
-hea
it replaced C:\Documents and Settings\all\Desktop to E:\.....
I think that FFP should account for that, running on the PC.
Insert original signature here with Greasemonkey Script.
Good summary, and good point about the language issue. I that case it would be safer to copy files before launch.
My point before about mentioning the non-existent folders was that if an app is coded without a backup method to SHGet***Path and a user redirects the USERPROFILE var to a non-existent directory, then that app *should* fail or do something very strange since it can't find the APPDATA location (blank path).
Would it be possible to add a variable for the folder, like...
Or is there a way to intercept what variable the program called. or adding the variable u want to the system, and then removing it when the app closes.
An eye for an eye makes the whole world blind.
Mahatma Gandhi,
Indian political and spiritual leader (1869 - 1948)
1. R0 in your above example is the name of the env variable, so it cannot be a path. It would have to be something like -
2. You can create whatever named env vars you want and set the data to whatever you want.
3. Unless you change the source of an app, you cannot control where it tries to retrieve its data from.
4. With the method you are using, the env vars are only temporary and only "seen" by your launcher and its children. So if you launcher starts app "b" and "b" starts app "c", then only the launcher, "b", and "c" can see your new vars.
Thanks everyone, but especially Wraithdu, for their comments.
Now I know a little more about environment variables and I know that will copy the files around as I don't want to change the source code.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
Hi everybody !
Thank You for interesting in WAtomic.
I'm the original developer of the puzzle game so if anyone would need some advice on the original Delphi source code please don't hesitate to send me a message at
ironfede AT users DOT sourceforge DOT net
I have not a lot of spare time at the moment so i can't warrant ultra-rapid answers
sorry !
Best Regards,
Federico Blaseotto
P.S.
Sorry for my bad English, my native language is Italian.
Welcome here
I think its always cool to have the original Developpers here in the forums.
"What about Love?" - "Overrated. Biochemically no different than eating large quantities of chocolate." - Al Pacino in The Devils Advocate
It makes it way easier to work on portability issues :D:D.
Insert original signature here with Greasemonkey Script.