Gold mine of Visual C++ tricks!
Archive for March 24, 2008
Interlocked family of functions for simple Synchronizations.
Mar 24th
![]()
In multithreaded environment we usually use Mutex to synchronize access to resources. But sometimes our resources may be a single integer member variable which holds some count or like that. For such light weight resource, using mutex is not preferred.
![]()
For that you can Interlocked family of functions. Please see some of the functions below.
InterlockedIncrement()
InterlockedDecrement()
InterlockedExchange()
InterlockedCompareExchange()
InterlockedExchangePointer()
…
For example if you need to increment a member variable threadsafely, you can use InterlockedIncrement(). That function will ensure the thread synchronization without any additional kernel objects such as mutex etc… Please see the code block below.
long m_lCount = 0;
...
// Increment the value.
InterlockedIncrement( &m_lCount );
InterlockedExchangePointer()
Do you know what is MZ?
Mar 24th
![]()
If you open any windows executable in some text editor you can see the executable starts with two chars – “MZ”. Do you know what it is ?
![]()
Windows executables are in PE( Portable Executable) file format. For backward compatibility with dos, the PE file format contains a small MS-DOS stub in the starting. That’s why when we run any windows application in DOS, it just print an error message that, it needs windows to execute the application.
The dos header starts with a special signature – “MZ”. MZ stands for Mark Zbikowski. He is one of the earlier Microsoft Architects and the designer of Dos Executable file format. In 2006 he was honored for 25 years of service with the company, the first employee to reach this milestone other than Bill Gates and Steve Ballmer
Digging history is Interesting… isn’t it ?
RunDll32.exe – The key to windows treasure chest.
Mar 24th
![]()
While digging the C:\Windows directory, a windows enthusiast surely will encounter the application RunDll32.exe. If executed it seems to do nothing. But its a key to great windows treasures. Still don’t believe me ? okay run the following command in your command prompt.
RUNDLL32.exe user32.dll, LockWorkStation
![]()
Actually speaking, RunDll32.exe is just a program which executes the specified funciton of the specified dll, passed via command line arguments. Please see the syntax as follows.
RUNDLL32.EXE dll_name, EntryPoint <Optional Arguments>
The only requirement is that the callable function’s prototype should be as follows.
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Window had implemented lot of functinalities inside which can be callable via RunDll32.exe. See some e.g. below.
RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3 - Shows the System Properties, Advanced tab.
RunDll32.exe shell32.dll,Control_RunDLL hdwwiz.cpl – Invokes Add new hardware wizard
Please refer http://www.dx21.com/SCRIPTING/RUNDLL32/REFGUIDE.ASP for huge list of features that can be accessed via RunDll32.
Usages:
1) You can create a shortcut for RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3 by which we can easly take the environment variables tab.
2) You can write some test functions in your dll and we can call it anytime anywhere without exe file.
The usages are many, only limitation is our imagination…
Easy Compilation guards instead of #ifndef macros
Mar 24th
![]()
Did you ever noticed the following lines in the your header file?
#ifndef _MYHEADER_H_ #define _MYHEADER_H_ ... #endif
They are protection macros to protect the header file from multiple compilation. Assume your header file is included many time in different CPP. if you are not using these protection macros, your header file will be included more than once and will give you a Multiple declaration error. To prevent that, these macros are being used. But there is a more simple method in VC++ compiler extension.
![]()
You can use #pragma once in your header file. E.g.
#pragma once ...
If you use #pragma once, then the header file will be included only once in your compilation.
See the assembly code generated for your source.
Mar 24th
![]()
For die-hard debugging purpouse and for learning the internals, usually we need to refer the assembly code generated by the compiler.
![]()
Add compiler switch /FAs in the project settings. It will generate .ASM files for each of your .cpp files with source code and inline assembly. See the following steps.
1) Take project setting by pressing Alt+F7
2) Take C/C++ tab
3) To the Project Options editbox, add /FAs.
4) Recompile the project.
5) Take the release or debug directory, you can see .asm files.
Embed a copyright notice in EXE
Mar 24th
![]()
You can embed any strings in your exe or dlls.
1) It can be used for copyright messages etc…
2) It can be used in Export DLL header files to know which version of DLL is linked in the exe.
Apply your imagination for more usages…
![]()
Use the #pragma directive. See the usage below.
#pragma comment(exestr, "This is my Exe. Don't copy it away!");
#pragma comment(exestr, "GraphicLibrary Version 1.01.");
![]()
Open the exe in textpad for seeing the data. Opening in notepad will not work.