How to refresh the WINDOWS desktop calling API-functions ?

Posted on 1998-07-11
Medium Priority
Last Modified: 2013-11-19
I have written an installation program with InstallShield 5.1. While deinstallation I call a custom-dll that deletes some files
that couldn't automatically deleted by unInstallShield. I have some shortcuts in WINDOWS start menu installed. After deinstallation I
can check with Explorer, that these .LNK-files in the subfolder of the start menu are deleted, but they are still displayed in
Windows 95 start menu, because Windows keeps all the desktop symbols and start menu in cache. I asked this question also
at InstallShield, but didn't got any good answer for it. I could call while deinstallation any API-functions from my
custom-deinstallation-DLL, that could refresh the start menu and the desktop symbols.

I need a way how to do it !
Question by:atari
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Expert Comment

ID: 1319050
InstallShield provides functions to add/delete folders/icons/shortcuts. R u using free edition/professional edition? Professional edition has. If can not There are SDK functions to add/delete folders/icons...

Author Comment

ID: 1319051
This was not the question. I asked, how I can refresh the Windows startmenu entries and the Windows desktop after deinstallation. The problem is, that Windows hold all the startmenu entries and desktop symbols in cache and after deinstallation of my program the startmenu entries are still there and are updated only after rebooting of the system. That's a known problem for Installshield, but they have no solution how to refresh the start menu entries after deinstallation with unInstallShield. But I have seen a program, called 'TuneUp 97' that has an option to read the desktop symbols and the startmenu entries in Windows cache again. Afterwards my startmenu entries are correctly deleted. So there must be a way, to program this option with API-functions in VC++, to call it from my custom-deinstallation-DLL, that will be called after deinstallation with unInstallShield..
For your information: I'm using InstallShield 5.1 (newest available version.).

Expert Comment

ID: 1319052
Does this happen on NT as well?
Percona Live Europe 2017 | Sep 25 - 27, 2017

The Percona Live Open Source Database Conference Europe 2017 is the premier event for the diverse and active European open source database community, as well as businesses that develop and use open source database software.


Accepted Solution

piano_boxer earned 800 total points
ID: 1319053
I did a little 'reversed engenering' on TweakUI (PowerToys) and the only relevant functions I could find is this:

#include <shlobj.h>

// Refresh start-menu
HWND hwnd = <Handle of your window>!
SHGetSpecialFolderLocation(hwnd, CSIDL_STARTMENU, &lpil);

// Refresh desktop
SHGetSpecialFolderLocation(hwnd, CSIDL_DESKTOPDIRECTORY, &lpil);

For information about flags that you can pass to these functions, look in the file 'shlobj.h'. The docs are not very informative about these functions.

Author Comment

ID: 1319054
Answer to tma:
I have searched all the newsgroup of installshield.com and what was very nice, that also an installshield-engineer thought first, that it was a bug of InstallShield 5.1, that the start menu not always is refreshed, and he said, that in the next version of InstallShield this bug will be updated. One day later he wrote, that InstallShield and unInstallShield are both working correct, but the start menu entries are kept in cache and first after rebooting or again reading the cache again the startmenu .LNK-files will be refreshed. That was very funny, when I wrote this. The installshield engineer said, that it happens also on Windows95/NT and very surprisingly also on Windows 98. Sometimes the refresh is working correctly if you have a subfolder in startmenu-folder and you delete the whole folder after deinstallation. But if you have a multiple application installation, say you have a subfolder in startmenu-folder, that includes several links for deinstallation, called 'Deinstall program 1', 'Deinstall program 2' and so on, then after uninstalling only one of this program, say program 1, then the .LNK-file is correctly deleted, but in startmenu the entry 'Deinstall program 1' is still there.

This is only a comment.
Piano_boxer (nice name), nice answer, but seems very hard to implement, ok, I will try it, yes, I forgot Tweak UI, it's only hard to test, because I must install programs first and then uninstall it, and then my uninstall.dll will be called with the functions above.

Give me one or two days !

Author Comment

ID: 1319055
Great, everything works fine, the startmenu entries after calling SHChangeNotify( SHCNE_ALLEVENTS, SHCNF_IDLIST, lpil, NULL);  are now refreshed after deinstallation with unInstallShield.

Excellent answer, I am very surprised, that it works so fine.


Expert Comment

ID: 1319056
Great, I'm happy that it worked (I was unable to verify it 100% my self).

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…
Suggested Courses

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question