|
|
/*++
Copyright (c) 2001, Microsoft Corporation
Module Name:
dimmwrp.cpp
Abstract:
This file implements the CActiveIMMApp Class.
Author:
Revision History:
Notes:
--*/
#include "private.h"
#include "dimmwrp.h"
#include "resource.h"
#include "cregkey.h"
//
// Check IE5.5 version
//
static BOOL g_fCachedIE = FALSE; static BOOL g_fNewVerIE = FALSE;
#define IEVERSION55 0x00050032
#define IEVERSION6 0x00060000
//
// REGKEY
//
const TCHAR c_szMSIMTFKey[] = TEXT("SOFTWARE\\Microsoft\\CTF\\MSIMTF\\");
// REG_DWORD : 0 // No
// 1 // Only Trident (default)
// 2 // Always AIMM12
const TCHAR c_szUseAIMM12[] = TEXT("UseAIMM12");
// REG_MULTI_SZ
// Known EXE module list for Trident aware applications.
const TCHAR c_szKnownEXE[] = TEXT("KnownEXE");
//+---------------------------------------------------------------------------
//
// Check registry to decice load AIMM1.2
//
//----------------------------------------------------------------------------
#define DIMM12_NO 0
#define DIMM12_TRIDENTONLY 1
#define DIMM12_ALWAYS 2
DWORD IsAimm12Enable() { CMyRegKey Aimm12Reg; LONG lRet; lRet = Aimm12Reg.Open(HKEY_LOCAL_MACHINE, c_szMSIMTFKey, KEY_READ); if (lRet == ERROR_SUCCESS) { DWORD dw; lRet = Aimm12Reg.QueryValue(dw, c_szUseAIMM12); if (lRet == ERROR_SUCCESS) { return dw; } }
return DIMM12_TRIDENTONLY; }
//+---------------------------------------------------------------------------
//
// Is this trident module
//
// We should distinguish what exe module calls CoCreateInstance( CLSID_CActiveIMM ).
// If caller is any 3rd party's or unknown modle,
// then we could not support AIMM 1.2 interface.
//
//----------------------------------------------------------------------------
BOOL IsTridentModule() { TCHAR szFileName[MAX_PATH + 1]; if (::GetModuleFileName(NULL, // handle to module
szFileName, // file name of module
ARRAYSIZE(szFileName) - 1) == 0) return FALSE;
szFileName[ARRAYSIZE(szFileName) - 1] = TEXT('\0');
TCHAR szModuleName[MAX_PATH + 1]; LPTSTR pszFilePart = NULL; DWORD dwLen; dwLen = ::GetFullPathName(szFileName, // file name
ARRAYSIZE(szModuleName) - 1, szModuleName, // path buffer
&pszFilePart); // address of file name in path
if (dwLen > ARRAYSIZE(szModuleName) - 1) return FALSE;
if (pszFilePart == NULL) return FALSE;
szModuleName[ARRAYSIZE(szModuleName) - 1] = TEXT('\0');
//
// Setup system defines module list from registry value.
//
int len;
CMyRegKey Aimm12Reg; LONG lRet; lRet = Aimm12Reg.Open(HKEY_LOCAL_MACHINE, c_szMSIMTFKey, KEY_READ); if (lRet == ERROR_SUCCESS) { TCHAR szValue[MAX_PATH];
lRet = Aimm12Reg.QueryValueCch(szValue, c_szKnownEXE, ARRAYSIZE(szValue));
if (lRet == ERROR_SUCCESS) { LPTSTR psz = szValue; while (*psz) { len = lstrlen(psz);
if (lstrcmpi(pszFilePart, psz) == 0) { return TRUE; // This is Trident module.
}
psz += len + 1; } } }
//
// Setup default module list from resource data (RCDATA)
//
LPTSTR lpName = (LPTSTR) ID_KNOWN_EXE;
HRSRC hRSrc = FindResourceEx(g_hInst, RT_RCDATA, lpName, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)); if (hRSrc == NULL) return FALSE;
HGLOBAL hMem = LoadResource(g_hInst, hRSrc); if (hMem == NULL) return FALSE;
LPTSTR psz = (LPTSTR)LockResource(hMem);
while (*psz) { len = lstrlen(psz);
if (lstrcmpi(pszFilePart, psz) == 0) { return TRUE; // This is Trident module.
}
psz += len + 1; }
return FALSE; }
BOOL IsTridentNewVersion() { BOOL fRet = FALSE; TCHAR szMShtmlName[MAX_PATH + 1];
if (g_fCachedIE) { return g_fNewVerIE; }
//
// Get "mshtml.dll" module from system directory and read version.
//
if (GetSystemDirectory(szMShtmlName, ARRAYSIZE(szMShtmlName) - 1)) { UINT cb; void *pvData; DWORD dwVerHandle; VS_FIXEDFILEINFO *pffi; HRESULT hr;
szMShtmlName[ARRAYSIZE(szMShtmlName) - 1] = TEXT('\0'); hr = StringCchCat(szMShtmlName, ARRAYSIZE(szMShtmlName), TEXT("\\")); if (hr != S_OK) return FALSE; hr = StringCchCat(szMShtmlName, ARRAYSIZE(szMShtmlName), TEXT("mshtml.dll")); if (hr != S_OK) return FALSE;
cb = GetFileVersionInfoSize(szMShtmlName, &dwVerHandle);
if (cb == 0) return FALSE;
if ((pvData = cicMemAlloc(cb)) == NULL) return FALSE;
if (GetFileVersionInfo(szMShtmlName, 0, cb, pvData) && VerQueryValue(pvData, TEXT("\\"), (void **)&pffi, &cb)) { g_fCachedIE = TRUE;
//fRet = g_fNewVerIE = (pffi->dwProductVersionMS >= IEVERSION55);
if ((pffi->dwProductVersionMS >= IEVERSION55) && (pffi->dwProductVersionMS <= IEVERSION6)) { fRet = g_fNewVerIE = TRUE; } else { fRet = g_fNewVerIE = FALSE; } } else { fRet = FALSE; }
cicMemFree(pvData); }
return fRet; }
//+---------------------------------------------------------------------------
//
// GetCompatibility
//
//----------------------------------------------------------------------------
VOID GetCompatibility(DWORD* dw, BOOL* fTrident, BOOL* _fTrident55) { //
// Retrieve AIMM1.2 Enable flag from REGKEY
//
*dw = IsAimm12Enable();
//
// Retrieve Trident aware application flag from REGKEY and RESOURCE.
//
*fTrident = IsTridentModule();
//
// Check Trident version with "mshtml.dll" module
//
*_fTrident55 = FALSE;
if (*fTrident) { *_fTrident55 = IsTridentNewVersion(); } }
//+---------------------------------------------------------------------------
//
// VerifyCreateInstance
//
//----------------------------------------------------------------------------
BOOL CActiveIMMApp::VerifyCreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { DWORD dw; BOOL fTrident; BOOL _fTrident55; GetCompatibility(&dw, &fTrident, &_fTrident55);
if ( (dw == DIMM12_ALWAYS) || ((dw == DIMM12_TRIDENTONLY) && fTrident)) { //
// CreateInstance AIMM1.2
//
return CComActiveIMMApp::VerifyCreateInstance(pUnkOuter, riid, ppvObj); }
return FALSE; }
//+---------------------------------------------------------------------------
//
// PostCreateInstance
//
//----------------------------------------------------------------------------
void CActiveIMMApp::PostCreateInstance(REFIID riid, void *pvObj) { DWORD dw; BOOL fTrident; BOOL _fTrident55; GetCompatibility(&dw, &fTrident, &_fTrident55);
imm32prev::CtfImmSetAppCompatFlags(IMECOMPAT_AIMM_LEGACY_CLSID | (_fTrident55 ? IMECOMPAT_AIMM_TRIDENT55 : 0)); }
#ifdef OLD_AIMM_ENABLED
//+---------------------------------------------------------------------------
//
// Class Factory's CreateInstance (Old AIMM1.2)
//
//----------------------------------------------------------------------------
HRESULT CActiveIMM_CreateInstance_Legacy( IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { DWORD dw; BOOL fTrident; BOOL _fTrident55; GetCompatibility(&dw, &fTrident, &_fTrident55);
if ( (dw == DIMM12_ALWAYS) || ((dw == DIMM12_TRIDENTONLY) && fTrident)) { //
// CreateInstance AIMM1.2
//
g_fInLegacyClsid = TRUE; return CActiveIMM_CreateInstance(pUnkOuter, riid, ppvObj); }
return E_NOINTERFACE; }
#endif // OLD_AIMM_ENABLED
|