Download source files - 30 Kb
Introduction
In this article I'll present a way of calling a VB ActiveX
DLL from a MFC client application. There are other ways to do so but I find this
by far the easiest. Any information presented here is only for learning purposes.
I shall briefly point out the steps you need to follow-
- Create an ActiveX server component with VB. This is the ActiveX DLL you need to create with VB.
- Create an dialog based MFC application using the MFC Appwizard.
- Import the server's (DLL) type library into the MFC client app.
- Initialize the COM library
- Retrieve the CLSID of the server component.
- Create an instance of the COM server component.
- Use the COM object
- Uninitialize the COM library
First create a new ActiveX DLL project using VB 6.0. Name the project prjdll and the
class clsdll. Add a new function fnCallDll to the class. My function just displays a
messagebox and looks like
Public Function fnCallDll()
MsgBox "VB ActiveX DLL"
End Function
Save and compile this project to create prjdll.dll. This is
our server component.
Now we are going to develop the client. Create a new dialog based application in VC++ using MFC
Appwizard and save the project.
We are going to import the server component's type library using
the #import
statement. Copy
the prjdll.dll file to the directory where you have saved your
MFC Appwizard project. Click the FileView tab of the
Project Workspace window, expand the Header
Files folder, open the file stdafx.h and add
the following code (appears greyed)
# import "prjdll.dll"
using namespace prjdll;
You must add the above code after
and before
#endif
in the stdafx.h file.Importing the prjdll.dll file helps
the compiler to link to the dll's type library at runtime. The #import tells the
compiler to generate the wrapper class, which will encapsulate the functionalities of the
server component. If the server component is created using VB we need
the import the associated .dll file and if the component is
created using VC++, we need to import the .tlb file.The name of the
wrapper class will be same as the server component name, by default.
Compile the stdafx.cpp file. The
compiler generates a .tlh and a .tli file
in your projects Debug or Release directory (depending on your
configuration). These are the type library header and implementation files. Open
the .tlh file by double-clicking it and find out word immediately after the
word namespace. This is usually the name
of the project that we earlier created using VB.Look at the code we inserted
earlier to the stdafx.h file.The using namespace
is required so that we can access the server's methods.
Place a codebutton
control (IDC_BUTTON1
) on the dialog. Double-click the control to add a command handler OnButton1()
for the button. Now add the following code in the handler-
HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
hresult=CLSIDFromProgID(OLESTR("prjdll.clsdll"), &clsid);
_clsdll *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsdll),(LPVOID *) &t);
if(FAILED(hresult))
{
AfxMessageBox("Creation Failed");
return;
}
t->fnCallDll ();
t->Release();
CoUninitialize();
The name of the CoClass is _clsdll
. The CoCreateInstance
function returns the
address of the interface pointer requested. Now the pointer t can happily be
used to access the functionality of the server component.
That's it. On clicking the button a Messagebox should pop up.