Solved

ActiveX

Posted on 1998-12-15
13
515 Views
Last Modified: 2013-12-03
I need some sample code which can make use of events for an OLE automation object.  No MFC, ATL preferred.

0
Comment
Question by:faster
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 5
13 Comments
 
LVL 15

Expert Comment

by:Tommy Hui
ID: 1417259
If you have Visual C++, take a look at the \vc\samples\atl\connect\drive directory, in the drive.cpp file. That shows you how to catch events using ATL. If you do not have the sample, here is the class:

class CDriver :
      public IDispatchImpl<IRandomEvent, &IID_IRandomEvent, &LIBID_CONNECTLib>,
      public CComObjectRoot
{
public:
      CDriver() {}
BEGIN_COM_MAP(CDriver)
      COM_INTERFACE_ENTRY(IDispatch)
      COM_INTERFACE_ENTRY(IRandomEvent)
END_COM_MAP()

// IRandomEvent
      STDMETHOD(Fire)(long l)
      {
            _tprintf(_T("%d\n"), l);
            return S_OK;
      }
};


0
 
LVL 7

Author Comment

by:faster
ID: 1417260
I will study the example.

There is another problem: if I set the atl project to use multithreaded dll, it give me link error (unresolved symbol), do you know why?
0
 
LVL 7

Author Comment

by:faster
ID: 1417261
I tried to catch events from IE auotmation object,  AtlAdvise completed ok but no event is trapped.  Can you see where is my problem?  I note that in exdisp.h, DWebBrowserEvents methods are commented, does this mean that I need to use some other interface?

Below is my code (modified based on drive.cpp)

// Drive.cpp : Implementation of WinMain
//
// This is a part of the Active Template Library.
// Copyright (C) 1996-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.

// You will need the NT SUR Beta 2 SDK or VC 4.2 in order to build this
// project.  This is because you will need MIDL 3.00.15 or higher and new
// headers and libs.  If you have VC 4.2 installed, then everything should
// already be configured correctly.

#include "predrive.h"
#include "initguid.h"
#include "exdisp1.h"

//#define IID_DEFINED
#ifndef __IID_DEFINED__
#define __IID_DEFINED__

typedef struct _IID
{
    unsigned long x;
    unsigned short s1;
    unsigned short s2;
    unsigned char  c[8];
} IID;

#endif // __IID_DEFINED__

#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif

CComModule _Module;

/////////////////////////////////////////////////////////////////////////////
// CDriver

IID IID_DWebBrowserEvents = {0xEAB22AC2,0x30C1,0x11CF,{0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B}};
IID LIBID_DWebBrowserEvents = {0xEAB22AC0, 0x30C1, 0x11CF,{0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B}};
//const CLSID CLSID_InternetExplorer = {0x0002DF01,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
//const IID IID_IWebBrowserApp ={0x0002DF05,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

class CDriver :
      public IDispatchImpl<DWebBrowserEvents, &IID_DWebBrowserEvents, &LIBID_DWebBrowserEvents>,
      public CComObjectRoot
{
public:
      CDriver() {}
BEGIN_COM_MAP(CDriver)
      COM_INTERFACE_ENTRY(IDispatch)
      COM_INTERFACE_ENTRY(DWebBrowserEvents)
END_COM_MAP()

      // DWebBrowserEvents
      void BeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Cancel) {
            MessageBox(NULL, "BeforeNavigate","fired",MB_OK);
      };
      void NavigateComplete(BSTR URL) {};
      void StatusTextChange(BSTR Text) {};
      void ProgressChange(long Progress, long ProgressMax) {};
    void DownloadComplete(void) {};
    void CommandStateChange(long Command, VARIANT_BOOL Enable) {};
    void DownloadBegin(void) { };
    void NewWindow() {};
      void TitleChange(BSTR Text) {};
    void FrameBeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Cancel) {};
    void FrameNavigateComplete(BSTR URL) {};
    void FrameNewWindow(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Processed) {};
    void Quit(VARIANT_BOOL FAR* Cancel) {};
    void WindowMove(void) {};
    void WindowResize(void) {};
    void WindowActivate(void) {};
    void PropertyChange(BSTR szProperty) {};
};

/////////////////////////////////////////////////////////////////////////////
//

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      LPTSTR lpCmdLine, int nShowCmd)
{
      HRESULT hRes = CoInitialize(NULL);
//  If you are running on NT 4.0 or higher you can use the following call
//  instead to make the EXE free threaded.
//  This means that calls come in on a random RPC thread
//  HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
      _Module.Init(NULL, hInstance);

      CComObject<CDriver>* pDriver;
      IWebBrowserApp* pM;
      CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_ALL, IID_IWebBrowserApp, (void**)&pM);

      CComObject<CDriver>::CreateInstance(&pDriver);
      DWORD dwAdvise = 0;
      hRes = AtlAdvise(pM, pDriver->GetUnknown(), IID_DWebBrowserEvents, &dwAdvise);

      pM->put_Visible(TRUE);

      MSG msg;
      while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);

      AtlUnadvise(pM, IID_DWebBrowserEvents, dwAdvise);

      pM->Release();

      CoUninitialize();
      return 0;
}

0
Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

 
LVL 7

Author Comment

by:faster
ID: 1417262
I tried to catch events from IE auotmation object,  AtlAdvise completed ok but no event is trapped.  Can you see where is my problem?  I note that in exdisp.h, DWebBrowserEvents methods are commented, does this mean that I need to use some other interface?

Below is my code (modified based on drive.cpp)

// Drive.cpp : Implementation of WinMain
//
// This is a part of the Active Template Library.
// Copyright (C) 1996-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.

// You will need the NT SUR Beta 2 SDK or VC 4.2 in order to build this
// project.  This is because you will need MIDL 3.00.15 or higher and new
// headers and libs.  If you have VC 4.2 installed, then everything should
// already be configured correctly.

#include "predrive.h"
#include "initguid.h"
#include "exdisp1.h"

//#define IID_DEFINED
#ifndef __IID_DEFINED__
#define __IID_DEFINED__

typedef struct _IID
{
    unsigned long x;
    unsigned short s1;
    unsigned short s2;
    unsigned char  c[8];
} IID;

#endif // __IID_DEFINED__

#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif

CComModule _Module;

/////////////////////////////////////////////////////////////////////////////
// CDriver

IID IID_DWebBrowserEvents = {0xEAB22AC2,0x30C1,0x11CF,{0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B}};
IID LIBID_DWebBrowserEvents = {0xEAB22AC0, 0x30C1, 0x11CF,{0xA7,0xEB,0x00,0x00,0xC0,0x5B,0xAE,0x0B}};
//const CLSID CLSID_InternetExplorer = {0x0002DF01,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
//const IID IID_IWebBrowserApp ={0x0002DF05,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

class CDriver :
      public IDispatchImpl<DWebBrowserEvents, &IID_DWebBrowserEvents, &LIBID_DWebBrowserEvents>,
      public CComObjectRoot
{
public:
      CDriver() {}
BEGIN_COM_MAP(CDriver)
      COM_INTERFACE_ENTRY(IDispatch)
      COM_INTERFACE_ENTRY(DWebBrowserEvents)
END_COM_MAP()

      // DWebBrowserEvents
      void BeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Cancel) {
            MessageBox(NULL, "BeforeNavigate","fired",MB_OK);
      };
      void NavigateComplete(BSTR URL) {};
      void StatusTextChange(BSTR Text) {};
      void ProgressChange(long Progress, long ProgressMax) {};
    void DownloadComplete(void) {};
    void CommandStateChange(long Command, VARIANT_BOOL Enable) {};
    void DownloadBegin(void) { };
    void NewWindow() {};
      void TitleChange(BSTR Text) {};
    void FrameBeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Cancel) {};
    void FrameNavigateComplete(BSTR URL) {};
    void FrameNewWindow(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT FAR* PostData, BSTR Headers, VARIANT_BOOL FAR* Processed) {};
    void Quit(VARIANT_BOOL FAR* Cancel) {};
    void WindowMove(void) {};
    void WindowResize(void) {};
    void WindowActivate(void) {};
    void PropertyChange(BSTR szProperty) {};
};

/////////////////////////////////////////////////////////////////////////////
//

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      LPTSTR lpCmdLine, int nShowCmd)
{
      HRESULT hRes = CoInitialize(NULL);
//  If you are running on NT 4.0 or higher you can use the following call
//  instead to make the EXE free threaded.
//  This means that calls come in on a random RPC thread
//  HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
      _Module.Init(NULL, hInstance);

      CComObject<CDriver>* pDriver;
      IWebBrowserApp* pM;
      CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_ALL, IID_IWebBrowserApp, (void**)&pM);

      CComObject<CDriver>::CreateInstance(&pDriver);
      DWORD dwAdvise = 0;
      hRes = AtlAdvise(pM, pDriver->GetUnknown(), IID_DWebBrowserEvents, &dwAdvise);

      pM->put_Visible(TRUE);

      MSG msg;
      while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);

      AtlUnadvise(pM, IID_DWebBrowserEvents, dwAdvise);

      pM->Release();

      CoUninitialize();
      return 0;
}

0
 
LVL 23

Expert Comment

by:chensu
ID: 1417263
It seems that you are doing what the following article discusses.
http://www.microsoft.com/msj/0698/browser.htm

Download the code. There are samples in VB, MFC and ATL.
0
 
LVL 7

Author Comment

by:faster
ID: 1417264
Thanks Chensu, but the MFC example gave me some problem: whenever I click inside the WebConrtrol, it crashes.  This happens in the IDE only. Does it happen on your machine?

BTW, I did not find an installation program for internet client SDK, so I simply copied the include directory and lib directroy to VC, will that cause any problem?
0
 
LVL 23

Expert Comment

by:chensu
ID: 1417265
>Does it happen on your machine?

No. It works fine.

>will that cause any problem?

Maybe. I remember there is an installation program for the Internet Client SDK. Why don't you use the latest Platform SDK which includes the Internet Client SDK?
0
 
LVL 7

Author Comment

by:faster
ID: 1417266
Which version of VC++ are you using?

I had Internet Client SDK, but didn't find any installation program.
0
 
LVL 23

Expert Comment

by:chensu
ID: 1417267
Version 5.0. Try the latest Platform SDK.
0
 
LVL 7

Author Comment

by:faster
ID: 1417268
Is your VC with any patch?  And what is your OS?

"the latest Platform SDK", which one do you mean?  And you find a setup.exe for it?
0
 
LVL 23

Expert Comment

by:chensu
ID: 1417269
>Is your VC with any patch?

Yes, Service Pack 3.

>And what is your OS?

I used Windows 95 to try that program.

>"the latest Platform SDK", which one do you mean?

I mean the Platform SDK September 1998 Edition that comes with MSDN CDs. Or you can download the Build Environment at http://msdn.microsoft.com/developer/sdk/bldenv.htm.

>And you find a setup.exe for it?

Yes.

0
 
LVL 7

Author Comment

by:faster
ID: 1417270
I found out that the crash is due to boundschecker, seems that boundschecker has some problem when debugging OLE applications.

You can submit an answer. Thanks.
0
 
LVL 23

Accepted Solution

by:
chensu earned 200 total points
ID: 1417271
0

Featured Post

Salesforce Has Never Been Easier

Improve and reinforce salesforce training & adoption using WalkMe's digital adoption platform. Start saving on costly employee training by creating fast intuitive Walk-Thrus for Salesforce. Claim your Free Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What my article will show is if you ever had to do processing to a listbox without being able to just select all the items in it. My software Visual Studio 2008 crystal report v11 My issue was I wanted to add crystal report to a form and show…
Entering time in Microsoft Access can be difficult. An input mask often bothers users more than helping them and won't catch all typing errors. This article shows how to create a textbox for 24-hour time input with full validation politely catching …
The purpose of this video is to demonstrate how to set up the WordPress backend so that each page automatically generates a Mailchimp signup form in the sidebar. This will be demonstrated using a Windows 8 PC. Tools Used are Photoshop, Awesome…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

691 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question