Click here to Skip to main content
15,885,028 members
Articles / Desktop Programming / MFC
Article

Calling a VB ActiveX DLL from a MFC Client

Rate me:
Please Sign up or sign in to vote.
4.63/5 (27 votes)
13 Sep 2000 531.1K   2.6K   44   161
A simple way to call a VB ActiveX DLL from a VC/MFC Client
  • 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

    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately  

    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);	//initialize COM library
    hresult=CLSIDFromProgID(OLESTR("prjdll.clsdll"), &clsid);    //retrieve CLSID of component
    		
    _clsdll *t; 
    hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsdll),(LPVOID *) &t);
    if(FAILED(hresult))
    {
    	AfxMessageBox("Creation Failed");
    	return;
    }
    
    t->fnCallDll ();  //call method
    t->Release();   //call method
    CoUninitialize();  //Unintialize the COM library         

    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.

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    Web Developer
    India India
    Amit Dey is a freelance programmer from Bangalore,India. Chiefly programming VC++/MFC, ATL/COM and PocketPC and Palm platforms. Apart from programming and CP, he is a self-taught guitar and keyboard player.

    He can be contacted at visualcdev@hotmail.com


    Comments and Discussions

     
    GeneralActive X DLL Pin
    Anonymous3-Dec-02 0:49
    Anonymous3-Dec-02 0:49 
    GeneralRe: Active X DLL Pin
    Anonymous3-Dec-02 8:32
    Anonymous3-Dec-02 8:32 
    GeneralGetting errors - help! Pin
    yyh19-Nov-02 16:54
    yyh19-Nov-02 16:54 
    GeneralRe: Getting errors - help! Pin
    Anonymous20-Nov-02 4:49
    Anonymous20-Nov-02 4:49 
    QuestionWhy should i compile the vb dll again and again? Pin
    Anonymous3-Nov-02 2:04
    Anonymous3-Nov-02 2:04 
    AnswerRe: Why should i compile the vb dll again and again? Pin
    Amit Dey3-Nov-02 4:31
    Amit Dey3-Nov-02 4:31 
    GeneralRe: Why should i compile the vb dll again and again? Pin
    Anonymous4-Nov-02 3:33
    Anonymous4-Nov-02 3:33 
    GeneralRe: Why should i compile the vb dll again and again? Pin
    Amit Dey4-Nov-02 3:56
    Amit Dey4-Nov-02 3:56 
    GeneralRe: Why should i compile the vb dll again and again? Pin
    Anonymous4-Nov-02 4:13
    Anonymous4-Nov-02 4:13 
    General"Creation Failed" Forgot !!! Main step to get this work. Pin
    kln31-Oct-02 23:52
    kln31-Oct-02 23:52 
    QuestionIf VB active dll refer another dll internall? Pin
    anju29-Aug-02 0:06
    anju29-Aug-02 0:06 
    Generalcalling a vb Activex DLL from a ATL Pin
    vbjunior21-Aug-02 23:29
    sussvbjunior21-Aug-02 23:29 
    GeneralRe: calling a vb Activex DLL from a ATL Pin
    Amit Dey27-Aug-02 14:22
    Amit Dey27-Aug-02 14:22 
    GeneralCalling Dll file functions from a web page Pin
    HoumamAlmasri15-Aug-02 14:45
    HoumamAlmasri15-Aug-02 14:45 
    GeneralRe: Calling Dll file functions from a web page Pin
    Amit Dey27-Aug-02 14:27
    Amit Dey27-Aug-02 14:27 
    GeneralPlease help!!! Pin
    Yaron Shkop12-Aug-02 23:53
    Yaron Shkop12-Aug-02 23:53 
    GeneralWhen I test with my own dll. it works OK. Pin
    Anonymous8-Aug-02 23:25
    Anonymous8-Aug-02 23:25 
    GeneralNice but..... Pin
    Salman Ahmad Khan23-Jul-02 19:40
    Salman Ahmad Khan23-Jul-02 19:40 
    GeneralProblem calling Outlook with ActiveX commands Pin
    Torge22-Jul-02 0:08
    Torge22-Jul-02 0:08 
    GeneralGreat tutorial ! Pin
    Moultipass22-May-02 3:53
    Moultipass22-May-02 3:53 
    GeneralNot able to execute the function Pin
    20-May-02 7:02
    suss20-May-02 7:02 
    GeneralDon't know why its here Pin
    24-Apr-02 2:03
    suss24-Apr-02 2:03 
    GeneralRe: Don't know why its here Pin
    Amit Dey1-Jul-02 3:56
    Amit Dey1-Jul-02 3:56 
    GeneralMTS Component Pin
    22-Mar-02 17:18
    suss22-Mar-02 17:18 
    GeneralCalling VBScript dll from VC Pin
    20-Mar-02 23:08
    suss20-Mar-02 23:08 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.