Environment: VC6, SP4, 2K, SP2
This article explains a better way of calling a function in an EXE file from a dependent DLL of the same EXE. In other words, calling a DLL’s function from an EXE is the normal way; this is the reverse of the same.
On CodeGuru I have found a couple of FAQs talking about the same issue. They tell you to have a call back function to hold the pointer from the EXE and so on, but they look primitive. In this article, I have given a better method of calling functions from the EXE. I would be glad if this helps someone in need.
In the EXE:
// Do exactly as you would export a DLL…
EXPORT void ExeFn(char * lpszMessage)
In the DLL:...
// Get the handle of the EXE that loaded us.
FnPtrT FnPtr = (FnPtrT)::GetProcAddress(GetModuleHandle(NULL),
(*FnPtr)("Message From The DLL");
MessageBox(NULL,"It Did Not work :(","From DLL",MB_OK);
Note: In this demo project, I have just implemented the above-mentioned exports. The EXE calls the DLL's function and that function calls a function in the EXE. Those functions do nothing more than display message boxes, so there's no point in giving a demo EXE. Just build the source; you must get the DLL and EXE.
How to Build It
- Extract the source zip file. Open workspace "ExportingExe.dsw".
- Ensure that ExportingExe is the active project. Now, you can build and run it.
- Because Importing.DLL is a dependency of the other one, you don't have to bother about anything else.