Skip to main content
Email Password   helpLost your password?

Introduction

After porting one of my old VC 6.0 projects to VC 7.0, I found that all the executable files were dependant on the library oleacc.dll, which is the core file of Microsoft Active Accessibility (MSAA). Because MSAA is released in 1997, some old OSs - Windows 95, Windows NT and Windows 98 (without Active Accessibility Options installed) do not support it normally. So my program failed to run on these platforms! This has caused me quite a headache.

I checked the MFC source code and found that only these 3 procedures in oleacc.dll were called by MFC 7.0 in some member functions of class CWnd:

After did some simple researches, I found the solution:

  1. Remove the dependence to oleacc.lib from my project
    Select "Properties..." from the "Project" menu. In the configuration tree of the dialog, select catalog "Linker" and click "Input".  Click "Ignore Specific Library" and enter "oleacc.lib".
     
  2. Write my own proxy functions
    All of these functions have the same name to the corresponding MSAA APIs. In these functions, I dynamically load oldacc.dll, and then call the corresponding procedures in oleacc.dll if it is loaded successfully. I encapsulated these function to 2 files: oleaccproxy.h and oleaccproxy.cpp and then added the them to my project. The source code for the proxy is shown below.
     
  3. Rebuild the project
    After rebuilt the project, the output executable file does not depend on oleacc.dll and if MSAA is present on target platform, the MSAA features will still function properly.

Source Code

The header file

#pragma once

typedef LRESULT (_stdcall *pfnAccessibleObjectFromWindow)(HWND hwnd, DWORD dwId, 
                                                    REFIID riid, void **ppvObject);
typedef LRESULT (_stdcall *pfnCreateStdAccessibleObject)(HWND hwnd, LONG idObject, 
                                                    REFIID riid, void** ppvObject);
typedef LRESULT (_stdcall *pfnLresultFromObject)(REFIID riid, WPARAM wParam, 
                                                    LPUNKNOWN punk);

class COleaccProxy
{
public:
    COleaccProxy(void);
    virtual ~COleaccProxy(void);

private:
    static HMODULE m_hModule;
    static BOOL m_bFailed;
    
public:
    static void Init(void);
    static pfnAccessibleObjectFromWindow m_pfnAccessibleObjectFromWindow;
    static pfnCreateStdAccessibleObject m_pfnCreateStdAccessibleObject;
    static pfnLresultFromObject m_pfnLresultFromObject;
};

The implementation file

#include "StdAfx.h"

#include "oleaccproxy.h"



extern "C" LRESULT _stdcall AccessibleObjectFromWindow(HWND hwnd, DWORD dwId, 
                                                       REFIID riid, void **ppvObject)
{
    COleaccProxy::Init();
    return COleaccProxy::m_pfnAccessibleObjectFromWindow ? 
       COleaccProxy::m_pfnAccessibleObjectFromWindow(hwnd, dwId, riid, ppvObject) : 0;
}

extern "C" LRESULT _stdcall CreateStdAccessibleObject(HWND hwnd, LONG idObject, 
                                                      REFIID riid, void** ppvObject)
{
    COleaccProxy::Init();
    return COleaccProxy::m_pfnCreateStdAccessibleObject ? 
       COleaccProxy::m_pfnCreateStdAccessibleObject(hwnd, idObject, riid, ppvObject) : 0;
}

extern "C" LRESULT _stdcall LresultFromObject(REFIID riid, WPARAM wParam, LPUNKNOWN punk)
{
    COleaccProxy::Init();
    return COleaccProxy::m_pfnLresultFromObject ? 
       COleaccProxy::m_pfnLresultFromObject(riid, wParam, punk) : 0;
}

HMODULE COleaccProxy::m_hModule = NULL;
BOOL COleaccProxy::m_bFailed = FALSE;

pfnAccessibleObjectFromWindow COleaccProxy::m_pfnAccessibleObjectFromWindow = NULL;
pfnCreateStdAccessibleObject COleaccProxy::m_pfnCreateStdAccessibleObject = NULL;
pfnLresultFromObject COleaccProxy::m_pfnLresultFromObject = NULL;

COleaccProxy::COleaccProxy(void)
{
}

COleaccProxy::~COleaccProxy(void)
{
}

void COleaccProxy::Init(void)
{
    if (!m_hModule && !m_bFailed)
    {
        m_hModule = ::LoadLibrary(_T("oleacc.dll"));
        if (!m_hModule)
        {
            m_bFailed = TRUE;
            return;
        }

        m_pfnAccessibleObjectFromWindow
             = (pfnAccessibleObjectFromWindow)::GetProcAddress(m_hModule, 
                                                          _T("AccessibleObjectFromWindow"));
        m_pfnCreateStdAccessibleObject
             = (pfnCreateStdAccessibleObject)::GetProcAddress(m_hModule, 
                                                          _T("CreateStdAccessibleObject"));
        m_pfnLresultFromObject = (pfnLresultFromObject)::GetProcAddress(m_hModule, 
                                                          _T("LresultFromObject"));
    }
}
You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Generaldlls Pin
fcvjapan
5:10 9 May '06  
Generalthe window close after the program run Pin
ysf02
1:25 5 Jul '05  
GeneralHow to get chiness String (Unicode) Pin
Lao Jing Lu
23:57 20 Jun '04  
GeneralLinking error Pin
diegoaso
11:55 15 Mar '04  
GeneralHow do U Link a ini file in Visual C++? Pin
DrRayen
9:29 5 Mar '04  
GeneralFinding dialogs Pin
p_khasnis
0:14 26 Dec '03  
GeneralAbout the SAFEARRAY** when using an AcgtiveX DLL Pin
blueeyesblue
6:31 9 Nov '03  
Generaldo you have helper.... Pin
firesw
0:18 28 May '03  
GeneralThanks a lot Pin
zhangzq71
7:48 16 Apr '03  
Generalwhen using UNICODE Pin
zxmjp07
5:51 24 Mar '03  
Generalthanks Pin
Kammerer Volker
4:16 10 Jan '03  
GeneralQ325014 Addresses This Issue Pin
Jeff Briggs
17:06 7 Nov '02  
GeneralRe: Q325014 Addresses This Issue Pin
David Vest
7:46 8 Mar '03  
GeneralProblems Pin
Denes
6:37 25 Oct '02  
AnswerRe: Problems Pin
sajithomas
1:35 23 Oct '09  
GeneralUse delayload Pin
Rama Krishna
4:37 12 Jun '02  
GeneralRe: Use delayload Pin
Chen Hao
16:57 13 Jun '02  
GeneralRe: Use delayload Pin
Pieter Greyling
9:46 15 Aug '02  
GeneralRe: Use delayload Pin
Jaro
0:24 20 Aug '02  
GeneralRe: Use delayload Pin
Anonymous
18:03 11 Oct '02  
GeneralGreat !! Thank you Pin
luca_covolo
1:42 29 Nov '02  


Last Updated 9 Jun 2002 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009