CreateDirectory() C (Windows VISTA/XP) - c

How can I create a directory in C and assign an icon to the folder all with in my program?
The point of this is all doing this in one program without any other dependencies. Is this possible?

CreateDirectory itself does not support creating an association between a directory and an icon. A directory can have an icon associated with it by instructing the shell to do so.
One way of doing this would be to specify the path to the icon in a desktop.ini file within the target directory.
I'm not sure if this still works because the last time I did it was in Windows 9x but I have seen a few desktop.ini files in Vista so I assume it is still supported to some extent
[Shell]
Icon=<path to icon>
NB: This may still work only because the support is provided for backwards-compatibility with earkier versions of Explorer. It's possible there is another less legacy way of doing this now that I am not aware of

Related

My application won't show up in Windows 10 Start search

I wrote a Win-32 desktop application in 1999 and have maintained it through the various iterations of Windows ever since. It didn't need a 64-bit address space so I never bothered to migrate it to the 64-bit apis.
Until Win 10 came along, I could type < the first few letters of my app's name> and the app would run.
In Win 10, I have to double click on the app to get it to run. If I try the app's folder and its contents show in the start menu but not the app itself. I look under all apps and the app isn't there. I've added a shortcut to the start menu but even that hint isn't enough for Windows to find the app. I tried creating a bat file that would fire off the app and placed the bat file in Programs Folder but that failed.
I never wrote an installer for the app. The app lives in its own folder which I create by dragging it from a CD or network drive as I have migrated between all the Windows iterations since Win-98.
Is there now some xml file I must create that says "This is an app. Please Microsoft, include it in the start menu?" I had thought *.exe would suffice but apparently not. Perhaps *.exe code must now reside in Programs Folder, no exceptions allowed?
If it makes any difference, the application is written in C and compiled in Visual Developer 2008. It reads kid's handwritten responses to arithmetic questions.
More info I've dug up...
I noticed that Python shows up in Windows search but PHP doesn't. IIRC, I installed python with an installer whereas php was unzipped into its current location.
That establishes that a program need not reside in C:\Program Folder to show up in Start-search.
Then I discover that Python has a shortcut in C:\ProgramData\Microsoft\Windows\Start Menu\Programs but PHP doesn't. "That's it!" I think. Nope. Start-search now shows the folder I placed there but not the shortcut to the program. So residence in the start menu folder doesn't do it.
I am obnoxed.
..even more info...
I recompiled the entire project and now search finds the executable which suggests start-search is broken. Moreover, start-search only displays the app if I completely type its name. In Win 7, just the first few letters suffice as is the case with most executables in win10.
The app still doesn't appear in the all apps section but then again, neither do the autodesk apps I have installed. OTOH, the autodesk apps appear by typing just a few letters.
At this point, it appears win10 start-search is broken.
Most .exe files don't appears in Windows Search under Win10 unless they are installed in program files folder... I try to find a way to circumvent this limitation cause lot of my files are portable applications on another drive.
In meantime here's a Workaround: Make a folder "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\DummyApps" and copy the shortcut of the app you want to be listed in "Search Results" in the DummyApps folder.
I've made a shorcut of "DummyApps" on my desktop to drop shortcut of programs I want to access by the search.
Regards
When you say
I've added a shortcut to the start menu but even that hint isn't enough for Windows to find the app
do you mean that you added a shortcut here: C:\ProgramData\Microsoft\Windows\Start Menu\Programs ?
If so, did you restart your pc (or at least explorer.exe)?
Adding a shortcut to the location above and restarting explorer.exe worked for me and it even added the app to the recently added apps section. Hopefully that helps.
step 1:win10 +x, open cmd adminstration mode
step 2:input 'start powershell' in cmd
step 3:input 'Get-AppXPackage -Name Microsoft.Windows.Cortana | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}' in powershell

Execute a program with a custom .ini path

I make a fair amount portable Apps for personal use and they work perfectly for the most part. I do, however, find it quite frustrating that if I run them on another computer none of my preferences are retained, as a program always looks in appData for the configuration files (which obviously don't exist on another system), so I'm wondering whether there is some kind of command line to launch an .exe with a custom .ini location.
I'm asking this firstly because Google has proved fruitless (once again) and secondly because I know it's possible - I've actually done this before, but with only one of my Apps. I accomplished this by launching the App via the command programFile.exe -f configFile.ini /s (I have also seen programFile.exe -d -f configFile.ini /s elsewhere). Naturally, I thought I would try to apply this to some other Apps but it seems it only works for that particular App.
So, is there a command/switch that I am unaware of that will do this for an .exe file?
Thanks
It really depends on each executable file you are using. Some have support for what you are looking for, and some don't. Some programs don't even use .ini files. What you should look for is if each and every program you use have support for user data custom location.
Edit
The only case where generic arguments would be avaialble for a group of EXE files is if they are generated with the same tool, which automatically provides these arguments for you. InstallShield and MSI install programs have that kind of feature (with the silent install and automated installation for instance).
I suggest you look into the tool you are using to generate your portable Apps, and see if it does provide those generic arguments for you, and how they work. If it does not have that feature, then look into the Apps you were able to specify a custom location for your INI file. Somewhere into the code, there must be a piece of code that handles the arguments you specify to the EXE file and handles them. You should share that piece of code with your other Apps, to make sure they provide the same arguments list.

Question about file handling

Hey, I wanted to know if anyone can tell me what the difference between "file.file" and "./file.file" is. It seems to make quite a significant difference in my programs to call
OpenFile("./file.file");
EDIT: My mistake, I thought my question was a generic one. This is in C++ using standard library functions.
In general, "./File" will be relative to the directory that your program's context is currently executing in.
Just "File" will be relative to the directory that the program executable resides in.
This is pretty dependent on what tool or language you're using, however.
If you're referring to the WinAPI function, see the remarks section on this MSDN page:
Remarks
If the lpFileName parameter specifies
a file name and extension only, this
function searches for a matching file
in the following directories and the
order shown:
The directory where an application is loaded.
The current directory.
The Windows system directory.
The 16-bit Windows system directory.
The Windows directory.
The directories that are listed in the PATH environment variable.
The ./file.ext means that it must be in the current directory, whereas not specifying a directory means it can be in any of the places normally checked.

How to allow a user to edit data in a separate app from the terminal?

I am writing a terminal-based application, but I want the user to be able to edit certain text data in a separate editor. For example, if the user chooses to edit the list of current usernames, the list should open as a text file in the user's favorite editor (vim, gedit, etc.). This will probably be an environment variable such as $MYAPPEDITOR. This is similar to the way commit messages work in svn.
Is the best way to do this to create a temporary file in /tmp, and read it in when the editor process is terminated? Or is there a better way to approach this problem?
There's already a $EDITOR variable, which is extremely standard and I have seen it working on a wide variety of unixes. Also, vi is always an option on any flavor of unix.
Debian has a sensible-editor command that invokes $EDITOR if it can, or falls back to some standard ones otherwise. Freedesktop.org has an xdg-open command that will detect which desktop environment is running and open the file with the associated application. As far as I know, sensible-editor doesn't exist on other distributions, and of course xdg-open will fail in a text-only environment, but it couldn't hurt to try as many options as possible, if you think it's important that a desktop user can see their happy shiny gedit or kate instead of scary old vi or nano. ;)
The way crontab and sudoedit work is also by making a file in /tmp. git puts it under .git, and svn actually puts it in the current directory (not /tmp).
The way svn and mercurial do it is by making a file in /tmp.
BTW, you don't need a MYAPPEDITOR, on nix there's EDITOR already present.
Since you mention svn in your post, why not just follow the same methodology? svn opens a file with a particular name with whatever $EDITOR (or $SVN_EDITOR) contains - this might actually require some work on your part; determining the parameters to each supported editor. In either case, you have the name of the file that was saved (or the error code of the application if something failed) and you can just use that.

Icons from remote files

I have started coding an FTP client application (for fun). I’m trying to represent remotely hosted files with icons. For example, let’s say I’m browsing the root folder of an FTP server (/) and want to display the Backup.zip file with the icon association from that client operating system. On some systems, this may be the windows compression icon and other operating systems this may be WinZip or WinRAR icons.
I have the client browsing local files with the SHGetFileInfo() function. This works great with files that are local, however, this function requires the physical file in order to retrieve the associated icon. So, this will not work with remotely hosted files. I have found some samples of loading icons given a file extension, and this is really where the question comes in... What would be the best strategy to get icons associated to remote files?
Go to the registry every time and look up extension to icon associations
Create 1 byte files with each extension and use the SHGetFileInfo() function for remote files (using local 1 byte files as association for remote files)
Other strategies???
What would a professional software company creating an FTP client do?
Thank you for your time.
-Jessy Houle
I suggest that you don't go to the registry every time: go if you need to, but if you've already been for a given filetype then remember/cache that result (within your program) and reuse it.
Use the procedure here from a previous Stack Overflow question on the same idea and uses the registry instead of an actual file.
How can I get the filetype icon that Windows Explorer shows?

Resources