Wednesday, 17 August 2005

Getting the name of a Windows Control Panel Applet

I've been working on a program that needs to enumerate all the Control Panel applets in Windows, and ideally get the proper display name (rather than the .cpl filename). You can do this for a specific applet by using the DllImport Attribute to access the CPlApplet function that every applet implements: My problem is that I needed to call this function for all applets (including non-Microsoft ones). .NET allows you to do dynamic P/Invoke code, but the only post I found in Google was from someone who was unable to get it to work. After using ildasm.exe to study what IL was generated by the static version, I noticed that the once major difference was that the dynamic version lacked the "preservesig" statement. The way to add this in is to use a custom attribute - you can't do it via a parameter for any of the methods. The final version in VB.NET is based on the sample code from http://www.thecodeproject.com/csharp/dynamicinvokedll.asp

No comments: