POP3 Client Program As An ActiveX Object


Set the Environmental Variables



Makefile

USE_BASECTL=1
Proj = IELnk3

# pull in the master SDK makefile that defines all of the macros
#  and all of the build rules

!include <INetSDK.Mak>

all: $(ObjDir)\$(Proj).Ocx Register

$(ObjDir)\$(Proj).Ocx: $(@R).Obj $(@R).Res $(ObjDir)\Guids.Obj \

$(ObjDir)\$(Proj).Res: $(@B).Rc $(@R).Tlb  $(ObjDir)\$(Proj).tlb

$(ObjDir)\Guids.Obj: $(@B).Cpp c:\inetsdk\samples\basectl\Include\IPServer.H  $(@D)\IELnk3Ifc.H

$(ObjDir)\IELnk3.Obj: $(@B).Cpp c:\inetsdk\samples\basectl\\Include\IPServer.H \
        c:\inetsdk\samples\basectl\\Include\LocalSrv.H    \
         $(@D)\IELnk3Ifc.H c:\inetsdk\samples\basectl\\Include\CtrlObj.H \
         c:\inetsdk\samples\basectl\\Include\Globals.H \
        c:\inetsdk\samples\basectl\\Include\Util.H        \
         

IELnk3.cpp

#define INITOBJECTS                // define the descriptions for our objects
#include "IPServer.H"
#include "ielnk3Ifc.H"
#include "CtrlObj.H"
#include "Globals.H"
#include "Util.H"
#include <stdio.h>
#include <windows.h>
void abc(char *p)
{       FILE *fp=fopen("z.txt","a+");
        fprintf(fp,"%s\n",p);
        fclose(fp);
}
struct sockaddr_in A;
WSADATA W;
SOCKET S;
char aa[60000];
int i;int ff=0;long tot;
struct hostent *H;
char R[60000];char nc[5000];
void printlett();

class CielnkControl : public COleControl, public Iielnk
{
  public:
    DECLARE_STANDARD_UNKNOWN();
    DECLARE_STANDARD_DISPATCH();
    long _stdcall put_Hlink (BSTR val) ;
    STDMETHOD(put_Mode)(BSTR val) ;
    STDMETHOD(get_stat)(THIS_ long FAR* val) ;
    STDMETHOD(get_text)(THIS_ BSTR FAR* val) ;
    STDMETHOD_(void, Go)(THIS) ;
    STDMETHOD_(void,quit)(THIS);
    STDMETHOD_(void,next)(THIS);
    STDMETHOD_(VOID,prev)(THIS);
    CielnkControl(IUnknown *pUnkOuter);
    static IUnknown *Create(IUnknown *);
    STDMETHOD(LoadBinaryState)(IStream *pStream);
    STDMETHOD(SaveBinaryState)(IStream *pStream);
    STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pE);
    STDMETHOD(SaveTextState)(IPropertyBag *pPropertyBag, BOOL fWriteDefault);
    STDMETHOD(OnDraw)(DWORD dvaspect, HDC hdcDraw, LPCRECTL prcBounds,
                LPCRECTL prcWBounds, HDC hicTargetDev, BOOL fOptimize)
    {    return S_OK;}
    virtual LRESULT WindowProc( UINT msg, WPARAM wParam, LPARAM lParam);
    virtual BOOL    RegisterClassData(void);
};
DEFINE_CONTROLOBJECT(ielnk, &CLSID_ielnk,"ielnkCtl", CielnkControl::Create,
1,&IID_Iielnk,"ielnk.HLP",&DIID_DielnkEvents,
OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_RECOMPOSEONRESIZE|OLEMISC_CANTLINKINSIDE|OLEMISC_INSIDEOUT,
0,0,"ielnkWndClass",1,0,0,NULL);
char ii[100],jj[100] ;
const CLSID *g_pLibid = &LIBID_ielnkObjects;
WNDPROC g_ParkingWindowProc = NULL;
const VARIANT_BOOL g_fSatelliteLocalization =  FALSE;
LCID  g_lcidLocale = MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT);
const WCHAR g_wszLicenseKey [] = L"";
const WCHAR g_wszLicenseLocation [] = L"";
OBJECTINFO g_ObjectInfo[] = {CONTROLOBJECT(ielnk),EMPTYOBJECT, EMPTYOBJECT  };
const char g_szLibName[] = "ielnk";
void InitializeLibrary(void){}
void UninitializeLibrary(void){}
BOOL CheckForLicense(void) {return TRUE;}
BOOL RegisterData(void){ return TRUE;}
BOOL UnregisterData(void){ return TRUE;}
BOOL      CheckLicenseKey(LPWSTR wszCheckme){ return TRUE;}
BSTR      GetLicenseKey(void){return NULL;}

HANDLE ( WINAPI *pIcmpCreateFile )( VOID );
BOOL ( WINAPI *pIcmpCloseHandle )( HANDLE );
DWORD (WINAPI *pIcmpSendEcho)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD);
typedef HANDLE (WINAPI *FARPROC1)(void);
typedef BOOL (WINAPI *FARPROC2)(HANDLE );
typedef DWORD (WINAPI *FARPROC3)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD);
WNDCLASS wndclass;char bb[200];


IUnknown *CielnkControl::Create(IUnknown *pUnkOuter)
{
        CielnkControl *pNew = new CielnkControl(pUnkOuter);
        return pNew->PrivateUnknown();
}
CielnkControl::CielnkControl(IUnknown *pUnkOuter)
: COleControl(pUnkOuter, 0, (IDispatch *)this)
{
}
BOOL CielnkControl::RegisterClassData(void)
{
    wndclass.lpfnWndProc    = COleControl::ControlWindowProc;
    wndclass.hInstance      = g_hInstance;
    wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
    wndclass.lpszClassName  = WNDCLASSNAMEOFCONTROL(0);
    return RegisterClass(&wndclass);
}
STDMETHODIMP CielnkControl::LoadTextState(IPropertyBag *pPropertyBag,IErrorLog    *pErrorLog){    return S_OK;}
STDMETHODIMP CielnkControl::LoadBinaryState(    IStream *pStream){    return S_OK;}
STDMETHODIMP CielnkControl::SaveTextState(    IPropertyBag *pPropertyBag,    BOOL          fWriteDefaults){    return S_OK;}
STDMETHODIMP CielnkControl::SaveBinaryState(    IStream *pStream){      return S_OK;}
LRESULT CielnkControl::WindowProc(UINT   msg,WPARAM wParam,LPARAM lParam){    return OcxDefWindowProc(msg, wParam, lParam);}
void CielnkControl::Go(void)
{
        MessageBox(0,"in Go","In Go",0);
        MessageBox(0,jj,"name",0);
        WSAStartup (0x101, &W);
        S = socket(AF_INET, SOCK_STREAM,0);
        A.sin_family=AF_INET;
        A.sin_port = htons(110);
        H=gethostbyname("giasbm01.vsnl.net.in");
        A.sin_addr.s_addr=*((unsigned long *) H->h_addr);
        i=connect(S,(struct sockaddr *) &A,sizeof(A));
        sprintf(aa,"connect %d",i);
        abc(aa);
        i=recv(S,R,10000,0);
        sprintf(aa,"recv %d R %s",i,R);
        abc(aa);
        strcpy(R,"USER ");
        strcat(R,jj);
        strcat(R,"\r\n");
        i=send(S,R,strlen(R),0);
        sprintf(aa,"send %d ",i);
        abc(aa);
        strset(R,' ');
        i=recv(S,R,10000,0);
        sprintf(aa,"recv %d R %s",i,R);
        abc(aa);
        strcpy(R,"PASS ");
        strcat(R,ii);
        strcat(R,"\r\n");
        i=send(S,R,strlen(R),0);
        sprintf(aa,"send %d ",i);
        abc(aa);
        strset(R,' ');
        i=recv(S,R,10000,0);
        sprintf(aa,"recv %d R %s",i,R);
        abc(aa);
        strcpy(R,"STAT\r\n");
        i=send(S,R,strlen(R),0);
        sprintf(aa,"send %d ",i);
        abc(aa);
        strset(R,' ');
        i=recv(S,R,10000,0);
        tot = atol(R+4);
        int totbytes = atoi(R+6);
        sprintf(aa,"recv %d R== %s total no. of mails = %ld ..total bytes=%d",
                                                           i,R,tot,totbytes);
        abc(aa);
        if(tot != 0)
        {
                ff = 1;
                printlett();
        }
}

void printlett()
{
        char ee[100];
        strcpy(R,"RETR ");
        itoa(ff,ee,10);
        strcat(R,ee);
        strcat(R,"\r\n");
        i=send(S,R,strlen(R),0);
        sprintf(aa,"mailno..%d..send %d ",ff,i);
        abc(aa);
        MessageBox(0,aa,aa,0);
        strset(R,' ');
        i=recv(S,R,100,0);
        nc[0] = '\0';
        sprintf(aa,"recv chars = %d ",i);
        abc(aa);
        MessageBox(0,aa,aa,0);
        int cnt = atoi(R+15);
        sprintf(aa,"R...... %s  no.of chars = %d",R,cnt);
        abc(aa);
        MessageBox(0,aa,aa,0);
        int ct=0;
        i=0;
        while (ct <= cnt)
        {
                sprintf(aa,"ct=%d..cnt=%d",ct,cnt);
                MessageBox(0,aa,aa,0);
                strset(R,' ');
                i=recv(S,R,cnt,0);
                sprintf(aa,"recv chars = %d ",i);
                strcat(nc,R);
                abc(aa);
                sprintf(aa,"R...... %s",R);
                abc(aa);
                ct=ct+i;
        }
        strcat(nc,"\0");
        MessageBox(0,aa,aa,0);
}
void CielnkControl::quit()
{
        strcpy(R,"QUIT\r\n");
        i=send(S,R,strlen(R),0);
        sprintf(aa,"send %d ",i);
        abc(aa);
        MessageBox(0,"all","over",0);
}

void CielnkControl::next()
{
        if ( ff < tot)
        {
                ff++;
                printlett();
        }
}
void CielnkControl::prev()
{
        if ( ff > 1)
        {
                ff--;
                printlett();
        }
}

STDMETHODIMP  CielnkControl::put_Hlink(BSTR val)
{
        MAKE_ANSIPTR_FROMWIDE(tempVal, val);
        lstrcpy(ii, tempVal);
        return S_OK;
}
STDMETHODIMP  CielnkControl::put_Mode(BSTR val)
{
        MAKE_ANSIPTR_FROMWIDE(tempVal, val);
        lstrcpy(jj, tempVal);
        return S_OK;
}
STDMETHODIMP  CielnkControl::get_stat (long FAR * t) 
{
        *t = tot;
        return S_OK;
}

STDMETHODIMP CielnkControl::get_text(BSTR FAR * val)
{
        BSTR pq=BSTRFROMANSI(nc);
        *val = pq;
        return S_OK;
}



IELnk3.rc

1    TYPELIB MOVEABLE PURE   "ielnk3.TLB"

IELnk3.Odl

#include <olectl.h>
[uuid(7d635f23-984a-11cf-a3a9-00a0c9034920),helpstring("Library"),lcid(0x0000),version(1.0)]
    library ielnkObjects
    {
    importlib("STDOLE32.TLB");
    importlib(STDTYPE_TLB);
    [uuid(7e778e43-984a-11cf-a3a9-00a0c9034920),helpstring("Control"),hidden,dual,odl]
    interface Iielnk : IDispatch
    {
        [id(101), propput]
            HRESULT Hlink([in]  BSTR val);        // methods

        [id(102), propget]
            HRESULT stat([out, retval] long * val);

        [id(103), propget]
            HRESULT text([out, retval] BSTR *val);

        [id(108), propput]
            HRESULT Mode([in]  BSTR val);        // methods
        [id(109)]
            void  next();        // methods
        [id(110)]
            void  prev();        // methods
        [id(104)]
            void Go(void);
        [id(105)]
            void quit(void);

    };
    [uuid(804d86c3-984a-11cf-a3a9-00a0c9034920),helpstring("Event"),hidden]
    dispinterface DielnkEvents
    {
        properties:
	methods:
    };
    [uuid(80ec37c3-984a-11cf-a3a9-00a0c9034920),helpstring("ielnk control")]
    coclass ielnk
    {
        [default]         interface Iielnk;
	[default, source] dispinterface DielnkEvents;
    };
};

IELnk3.def

LIBRARY         ielnk3

EXPORTS         DllRegisterServer
EXPORTS		DllUnregisterServer
EXPORTS		DllCanUnloadNow
EXPORTS		DllGetClassObject


IELnk3Ifc.h

/* This header file machine-generated by mktyplib.exe */
/* Interface to type library: ielnkObjects */

#ifndef _ielnkObjects_H_
#define _ielnkObjects_H_

DEFINE_GUID(LIBID_ielnkObjects,0x7D635F23L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

DEFINE_GUID(IID_Iielnk,0x7E778E43L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

/* Definition of interface: Iielnk */
#undef INTERFACE
#define INTERFACE Iielnk

DECLARE_INTERFACE_(Iielnk, IDispatch)
{
#ifndef NO_BASEINTERFACE_FUNCS

    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    /* IDispatch methods */
    STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE;

    STDMETHOD(GetTypeInfo)(
      THIS_
      UINT itinfo,
      LCID lcid,
      ITypeInfo FAR* FAR* pptinfo) PURE;

    STDMETHOD(GetIDsOfNames)(
      THIS_
      REFIID riid,
      OLECHAR FAR* FAR* rgszNames,
      UINT cNames,
      LCID lcid,
      DISPID FAR* rgdispid) PURE;

    STDMETHOD(Invoke)(
      THIS_
      DISPID dispidMember,
      REFIID riid,
      LCID lcid,
      WORD wFlags,
      DISPPARAMS FAR* pdispparams,
      VARIANT FAR* pvarResult,
      EXCEPINFO FAR* pexcepinfo,
      UINT FAR* puArgErr) PURE;
#endif

    /* Iielnk methods */
    STDMETHOD(put_Hlink)(THIS_ BSTR val) PURE;
    STDMETHOD(get_stat)(THIS_ long FAR* val) PURE;
    STDMETHOD(get_text)(THIS_ BSTR FAR* val) PURE;
    STDMETHOD(put_Mode)(THIS_ BSTR val) PURE;
    STDMETHOD_(void, next)(THIS) PURE;
    STDMETHOD_(void, prev)(THIS) PURE;
    STDMETHOD_(void, Go)(THIS) PURE;
    STDMETHOD_(void, quit)(THIS) PURE;
};

DEFINE_GUID(DIID_DielnkEvents,0x804D86C3L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

/* Definition of dispatch interface: DielnkEvents */
#undef INTERFACE
#define INTERFACE DielnkEvents

DECLARE_INTERFACE_(DielnkEvents, IDispatch)
{
#ifndef NO_BASEINTERFACE_FUNCS

    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    /* IDispatch methods */
    STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE;

    STDMETHOD(GetTypeInfo)(
      THIS_
      UINT itinfo,
      LCID lcid,
      ITypeInfo FAR* FAR* pptinfo) PURE;

    STDMETHOD(GetIDsOfNames)(
      THIS_
      REFIID riid,
      OLECHAR FAR* FAR* rgszNames,
      UINT cNames,
      LCID lcid,
      DISPID FAR* rgdispid) PURE;

    STDMETHOD(Invoke)(
      THIS_
      DISPID dispidMember,
      REFIID riid,
      LCID lcid,
      WORD wFlags,
      DISPPARAMS FAR* pdispparams,
      VARIANT FAR* pvarResult,
      EXCEPINFO FAR* pexcepinfo,
      UINT FAR* puArgErr) PURE;
#endif
};

DEFINE_GUID(CLSID_ielnk,0x80EC37C3L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

#ifdef __cplusplus
class ielnk;
#endif

#endif


Guids.cpp

#define INITGUID                   // define all the guids.
#include "IPServer.H"
#include "olectl.h"
#include "ielnk3Ifc.H"



ielnk3.htm

<HTML>
<HEAD>
<TITLE>Hlink Control</TITLE>
</HEAD>
<BODY>
<OBJECT
id=ielnk1
type="application/x-oleobject"
classid="clsid:80EC37C3-984A-11CF-A3A9-00A0C9034920">
<PARAM NAME="hlink" value="http://www.microsoft.com"
CODEBASE="http://www.vijaymukhi.com/vmis/IELnk3.Ocx">
</OBJECT><br>

Name:      
<INPUT TYPE=TEXT size=25 NAME="nm"><p>
Password :
<INPUT TYPE=PASSWORD size=25 NAME="passwd"><p>
<INPUT TYPE=BUTTON VALUE="Submit" NAME="BtnGo"><p>
Total:      
<input type=text size=5 name ="stat"><p>
<INPUT TYPE=BUTTON VALUE="Next" NAME="Next">
<INPUT TYPE=BUTTON VALUE="Previous" NAME="Prev">
<INPUT TYPE=BUTTON VALUE="Quit" NAME="Quit">
<p>
<textarea name=txt1 rows=5 cols=80></textarea><p>
<SCRIPT LANGUAGE="VBSCRIPT">
Sub BtnGo_OnClick
        ielnk1.mode = nm.Value
        ielnk1.hlink = passwd.Value
        ielnk1.Go()
        stat.Value=ielnk1.stat
        txt1.Value = ielnk1.text
End Sub
Sub Next_OnClick
        ielnk1.next()
        txt1.Value = ielnk1.text
End Sub
Sub Prev_OnClick
        ielnk1.prev()
        txt1.Value = ielnk1.text
End Sub

Sub Quit_OnClick
        ielnk1.quit()
End Sub

</SCRIPT>

</BODY>
</HTML>



Have any suggestions, comments, ideas, cracked code, feedback. Feel free to get in touch with us.

Move back to the Vijay Mukhi's Technology Cornucopia Page to learn more about the other new Internet Technologies.


Vijay Mukhi's Computer Institute
VMCI, B-13, Everest Building, Tardeo, Bombay 400 034, India
E-mail:vmukhi@giasbm01.vsnl.net.in Tel : 91-22-496 4335 /6/7/8/9 Fax : 91-22-307 28 59
http://www.vijaymukhi.com