NNTP Client Program As An ActiveX Object


Set the Environmental Variables


Makefile

USE_BASECTL=1
Proj = IELnk4

# 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)\IELnk4Ifc.H

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

ielnk4.cpp

#define INITOBJECTS                // define the descriptions for our objects
#include "IPServer.H"
#include "ielnk4Ifc.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[6000];int i;struct hostent *H;
char R[10000];int p;

char q[10],r[10];char cc[10000];
int ff=1;long tot,tot1,tot2;
char nc[10000];char pq[100];
void printnews();
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_index1)(THIS_ long FAR* val) ;
    STDMETHOD(get_index2)(THIS_ long FAR* val) ;
    STDMETHOD(get_text)(THIS_ BSTR FAR *val);
    STDMETHOD_(void, Go)(THIS) ;
    STDMETHOD_(void,quit)(THIS);
    STDMETHOD_(void,next)(THIS);
    CielnkControl(IUnknown *pUnkOuter);
    static IUnknown *Create(IUnknown *);
    STDMETHOD(LoadBinaryState)(IStream *pStream);
    STDMETHOD(SaveBinaryState)(IStream *pStream);
    STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog);
    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_GUID(CLSID_ielnkGeneralPage, 0x8221f8a0, 0x984a, 0x11cf, 0xa3, 0xa9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0x20);
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,"ielnkWn
dClass",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 hIP;WSADATA wsa;HANDLE hIcmp;DWORD *dwIPAddr;struct hostent *phostent;
DWORD d;
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)
{
abc(" CielnkControl::Create");
CielnkControl *pNew = new CielnkControl(pUnkOuter);
return pNew->PrivateUnknown();
}
CielnkControl::CielnkControl(    IUnknown *pUnkOuter)
: COleControl(pUnkOuter, 0, (IDispatch *)this)
{
abc(" CielnkControl::CielnkControl");
}
BOOL CielnkControl::RegisterClassData(    void)
{
abc("CielnkControl::RegisterClassData");
    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)
{
abc("CielnkControl::Go");
MessageBox(0,"in Go","In Go",0);
MessageBox(0,jj,"name",0);
MessageBox(0,ii,"group name",0);
WSAStartup (0x101, &W);
S = socket(AF_INET, SOCK_STREAM,0);
A.sin_family=AF_INET;
A.sin_port = htons(119);
H=gethostbyname(jj);
sprintf(aa,"%s..",H->h_name);
abc(aa);
MessageBox(0,aa,aa,0);
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);
MessageBox(0,aa,aa,0);
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,aa,0);
strcpy(R,"GROUP  ");
strcat(R,ii);
strcat(R,"\r\n");
sprintf(aa,"R=%d..",strlen(R));
MessageBox(0,R,aa,0);
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d..",i);
abc(aa);
i=recv(S,cc,sizeof(cc),0);
sprintf(aa,"%d..%s",i,cc);
abc(aa);
MessageBox(0,aa,aa,0);
int ct1=0,ct;
tot=atol(cc+4);
sprintf(aa,"atol..tot=%ld ",tot);
MessageBox(0,aa,aa,0);
for (ct = 4; cc[ct] !=' ';ct++);
ct++;
for (ct1=0;cc[ct] !=' ';ct++,ct1++)
q[ct1]=cc[ct];
q[ct1]='\0';
tot1=atol(q);
sprintf(aa,"temp %s..index1..%ld",q,tot1);
MessageBox(0,aa,aa,0);
ct++;
for (ct1=0;cc[ct] !=' ';ct++,ct1++)
r[ct1]=cc[ct];
r[ct1]='\0';
tot2=atol(r);
sprintf(aa,"temp %s..index2",r,tot2);
MessageBox(0,aa,aa,0);
 
strcpy(R,"ARTICLE ");
strcat(R,q);
strcat(R," \r\n");
MessageBox(0,R,R,0);
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d..",i);
abc(aa);
MessageBox(0,"Before printnews","news",0);
printnews();
MessageBox(0,"hi in client","over",0);
}

void printnews()
{
MessageBox(0,aa,"ARTICLE",0);
strset(R,' ');
strset(nc,' ');
i=recv(S,R,10000,0);
strcpy(nc,R);
MessageBox(0,R,"R",0);
}


void CielnkControl::quit()
{
abc("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);
}

STDMETHODIMP  CielnkControl::put_Hlink(BSTR val)
{
abc("CielnkControl::put_Hlink");
MAKE_ANSIPTR_FROMWIDE(tempVal, val);
lstrcpy(ii, tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::put_Mode(BSTR val)
{
abc("CielnkControl::put_Mode");
MAKE_ANSIPTR_FROMWIDE(tempVal, val);
lstrcpy(jj, tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::get_stat (long FAR * t) 
{
abc("CielnkControl::get_stat");
MessageBox(0,"get_stat","get_stat",0);
*t = tot;
return S_OK;
}
STDMETHODIMP  CielnkControl::get_index1 (long FAR * t) 
{
abc("CielnkControl::get_index1");
MessageBox(0,"get_index1","get_index1",0);
*t = tot1;
return S_OK;
}
STDMETHODIMP  CielnkControl::get_index2 (long FAR * t) 
{
abc("CielnkControl::get_index2");
MessageBox(0,"get_index2","get_index2",0);
*t = tot2;
return S_OK;
}

STDMETHODIMP CielnkControl::get_text(BSTR FAR *val)
{
BSTR pq=BSTRFROMANSI(nc);
*val=pq;
return S_OK;
}
void CielnkControl::next()
{
strcpy(R,"NEXT\r\n");
i=send(S,R,strlen(R),0);
MessageBox(0,"next","next",0);
printnews();
}

Guids.cpp

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



ielnk4.def

LIBRARY         ielnk4

EXPORTS         DllRegisterServer
EXPORTS		DllUnregisterServer
EXPORTS		DllCanUnloadNow
EXPORTS		DllGetClassObject

ielnk4.odl

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

        [id(102), propput]
            HRESULT Mode([in]  BSTR val);        // methods

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

        [id(104), propget]
            HRESULT index1([out, retval] long * val);
        [id(105), propget]
            HRESULT index2([out, retval] long * val);

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

        [id(106)]
            void Go(void);
        [id(107)]
            void quit(void);
        [id(109)]
            void next(void);

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

ielnk4.rc

1    TYPELIB MOVEABLE PURE   "ielnk4.TLB"


IELnk4Ifc.h
( This file is created by mktyplib )

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

#ifndef _ielnkObjects_H_
#define _ielnkObjects_H_

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

DEFINE_GUID(IID_Iielnk,0x7E778E44L,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(put_Mode)(THIS_ BSTR val) PURE;
    STDMETHOD(get_stat)(THIS_ long FAR* val) PURE;
    STDMETHOD(get_index1)(THIS_ long FAR* val) PURE;
    STDMETHOD(get_index2)(THIS_ long FAR* val) PURE;
    STDMETHOD(get_text)(THIS_ BSTR FAR* val) PURE;
    STDMETHOD_(void, Go)(THIS) PURE;
    STDMETHOD_(void, quit)(THIS) PURE;
    STDMETHOD_(void, next)(THIS) PURE;
};

DEFINE_GUID(DIID_DielnkEvents,0x804D86C4L,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,0x80EC37C4L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

#ifdef __cplusplus
class ielnk;
#endif

#endif



ilenk4.htm

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

Enter NNTP Server Name:
<INPUT TYPE=TEXT size=25 NAME="nm"><p>
Enter the NewsGroup  :
<INPUT TYPE=Text size=25 NAME="ngrp"><p>

<INPUT TYPE=BUTTON VALUE="Send" NAME="BtnGo"><p>
No. of Messages :
<input type=text size=5 name ="stat">
Begin Index No.
<input type=text size=5 name ="ind1">
End Index No.
<input type=text size=5 name ="ind2"><p>
<textarea name=txt1 rows=5 cols=80></textarea><p>
<INPUT TYPE=BUTTON VALUE="Next" NAME="Next">
<INPUT TYPE=BUTTON VALUE="Quit" NAME="Quit">
<p>

<SCRIPT LANGUAGE="VBSCRIPT">
Sub BtnGo_OnClick
        ielnk1.mode = nm.Value
        ielnk1.hlink = ngrp.Value
        ielnk1.Go()
        stat.Value=ielnk1.stat
        ind1.Value=ielnk1.index1
        ind2.Value=ielnk1.index2
        txt1.Value = ielnk1.text
End Sub
Sub Next_OnClick
        ielnk1.next()
        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