|
|
//
// pimm.cpp
//
#include "private.h"
#include "defs.h"
#include "pimm.h"
#include "cdimm.h"
#include "globals.h"
#include "util.h"
#include "immxutil.h"
extern void DllAddRef(void); extern void DllRelease(void);
HRESULT CActiveIMM_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
LONG CProcessIMM::_cRef = -1;
//+---------------------------------------------------------------------------
//
// RunningInExcludedModule
//
// Exclude some processes from using the old aimm IIDs/CLSIDs.
//----------------------------------------------------------------------------
BOOL RunningInExcludedModule() { static const TCHAR c_szOutlookModule[] = TEXT("outlook.exe"); static const TCHAR c_szMsoobeModule[] = TEXT("msoobe.exe");
DWORD dwHandle; void *pvData; VS_FIXEDFILEINFO *pffi; UINT cb; TCHAR ch; TCHAR *pch; TCHAR *pchFileName; BOOL fRet; TCHAR achModule[MAX_PATH+1];
if (GetModuleFileName(NULL, achModule, ARRAYSIZE(achModule)-1) == 0) return FALSE;
// null termination.
achModule[ARRAYSIZE(achModule) - 1] = TEXT('\0');
pch = pchFileName = achModule;
while ((ch = *pch) != 0) { pch = CharNext(pch);
if (ch == '\\') { pchFileName = pch; } }
fRet = FALSE;
if (lstrcmpi(pchFileName, c_szOutlookModule) == 0) { static BOOL s_fCached = FALSE; static BOOL s_fOldVersion = TRUE;
// don't run aimm with versions of outlook before 10.0
if (s_fCached) { return s_fOldVersion; }
cb = GetFileVersionInfoSize(achModule, &dwHandle);
if (cb == 0) { // can't get ver info...assume the worst
return TRUE; }
if ((pvData = cicMemAlloc(cb)) == NULL) return TRUE; // assume the worst
if (GetFileVersionInfo(achModule, 0, cb, pvData) && VerQueryValue(pvData, TEXT("\\"), (void **)&pffi, &cb)) { fRet = s_fOldVersion = (HIWORD(pffi->dwProductVersionMS) < 10); s_fCached = TRUE; // set this last to be thread safe
} else { fRet = TRUE; // something went wrong
}
cicMemFree(pvData); } else if (lstrcmpi(pchFileName, c_szMsoobeModule) == 0) { //
// #339234.
//
// MSOOBE.EXE starts before the end user logon. However it opens an
// interactive windows station ("WinSta0") and open a default
// desktop ("Default"). So MSIMTF.DLL thinks it is not winlogon
// desktop. But the fact is that the thread is running on
// ".Default user". So I think we may not want to start Cicero
// there because it could load 3rd vender TIP.
//
// #626606
// msoobe doesn't allow any creating new process under Windows
// Product Activation wizard. That's the security reason to prevent
// people from replacing msoobe.exe with explorer.exe and running the
// machine without activating.
fRet = TRUE; }
return fRet; }
//+---------------------------------------------------------------------------
//
// Class Factory's CreateInstance - CLSID_CActiveIMM12
//
//----------------------------------------------------------------------------
// entry point for msimtf.dll
HRESULT CActiveIMM_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { CActiveIMM *pActiveIMM; HRESULT hr; BOOL fInitedTLS = FALSE;
if (ppvObj == NULL) return E_INVALIDARG;
*ppvObj = NULL;
if (NULL != pUnkOuter) return CLASS_E_NOAGGREGATION;
//
// Look up disabling Text Services status from the registry.
// If it is disabled, return fail not to support Text Services.
//
if (IsDisabledTextServices()) return E_FAIL;
if (RunningInExcludedModule()) return E_NOINTERFACE;
if (!IsInteractiveUserLogon()) return E_NOINTERFACE;
if (NoTipsInstalled(NULL)) return E_NOINTERFACE;
// init the tls
// nb: we also try to do this in Activate, but this is to preserve
// existing behavior on the main thread (HACKHACK)
if ((pActiveIMM = GetTLS()) == NULL) { if ((pActiveIMM = new CActiveIMM) == NULL) return E_OUTOFMEMORY;
if (FAILED(hr=pActiveIMM->_Init()) || FAILED(hr=IMTLS_SetActiveIMM(pActiveIMM) ? S_OK : E_FAIL)) { delete pActiveIMM; return hr; }
fInitedTLS = TRUE; }
// we return a per-process IActiveIMM
// why? because trident breaks the apt threaded rules
// and uses a single per-process obj
if (g_ProcessIMM) { hr = g_ProcessIMM->QueryInterface(riid, ppvObj); } else { hr = E_FAIL; }
if (fInitedTLS) { //
// Tell CActiveIMM which interface created.
//
if (SUCCEEDED(hr)) { pActiveIMM->_EnableGuidMap( IsEqualIID(riid, IID_IActiveIMMAppEx) ); }
// dec the ref on the tls. Normally it will drop from 2 -> 1
// if QueryInterface failed, it will be deleted
pActiveIMM->Release(); }
return hr; }
//+---------------------------------------------------------------------------
//
// Class Factory's CreateInstance - CLSID_CActiveIMM12_Trident
//
//----------------------------------------------------------------------------
// entry point for msimtf.dll
HRESULT CActiveIMM_CreateInstance_Trident(IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { HRESULT hr = CActiveIMM_CreateInstance(pUnkOuter, riid, ppvObj); if (SUCCEEDED(hr)) { g_fAIMM12Trident = TRUE; } return hr; }
//+---------------------------------------------------------------------------
//
// QueryInterface
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::QueryInterface(REFIID riid, void **ppvObj) { //
// 4955DD32-B159-11d0-8FCF-00AA006BCC59
//
static const IID IID_IActiveIMMAppTrident4x = { 0x4955DD32, 0xB159, 0x11d0, { 0x8F, 0xCF, 0x00, 0xaa, 0x00, 0x6b, 0xcc, 0x59 } };
//
// c839a84c-8036-11d3-9270-0060b067b86e
//
static const IID IID_IActiveIMMAppPostNT4 = { 0xc839a84c, 0x8036, 0x11d3, {0x92, 0x70, 0x00, 0x60, 0xb0, 0x67, 0xb8, 0x6e} };
if (ppvObj == NULL) return E_INVALIDARG;
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IActiveIMMAppTrident4x) || IsEqualIID(riid, IID_IActiveIMMAppPostNT4) || IsEqualIID(riid, IID_IActiveIMMApp)) { *ppvObj = SAFECAST(this, IActiveIMMApp *); } else if (IsEqualIID(riid, IID_IActiveIMMAppEx)) { *ppvObj = SAFECAST(this, IActiveIMMAppEx*); } else if (IsEqualIID(riid, IID_IActiveIMMMessagePumpOwner)) { *ppvObj = SAFECAST(this, IActiveIMMMessagePumpOwner *); } else if (IsEqualIID(riid, IID_IServiceProvider)) { *ppvObj = SAFECAST(this, IServiceProvider*); } else if (IsEqualIID(riid, IID_IAImmThreadCompartment)) { *ppvObj = SAFECAST(this, IAImmThreadCompartment*); }
if (*ppvObj) { AddRef(); return S_OK; }
return E_NOINTERFACE; }
//+---------------------------------------------------------------------------
//
// AddRef
//
//----------------------------------------------------------------------------
STDAPI_(ULONG) CProcessIMM::AddRef() { CActiveIMM *pActiveIMM;
// nb: our ref count is special!
// it is initialized to -1 so we can use InterlockedIncrement
// correctly on win95
if (InterlockedIncrement(&_cRef) == 0) { DllAddRef(); }
// inc the thread ref
if (pActiveIMM = GetTLS()) { pActiveIMM->AddRef(); } else { Assert(0); // how did we get this far with no tls!?
}
return _cRef+1; // "diagnostic" unthread-safe return
}
//+---------------------------------------------------------------------------
//
// Release
//
//----------------------------------------------------------------------------
STDAPI_(ULONG) CProcessIMM::Release() { CActiveIMM *pActiveIMM;
// dec the thread ref
if (pActiveIMM = GetTLS()) { pActiveIMM->Release(); } else { Assert(0); // how did we get this far with no tls!?
}
// nb: our ref count is special!
// it is initialized to -1 so we can use InterlockedIncrement
// correctly on win95
if (InterlockedDecrement(&_cRef) < 0) { DllRelease(); }
// this obj lives as long as the process does,
// so no need for a delete
return _cRef+1; // "diagnostic" unthread safe return
}
//+---------------------------------------------------------------------------
//
// Start
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::Start() { Assert(0); // who's calling this?
return E_NOTIMPL; }
//+---------------------------------------------------------------------------
//
// End
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::End() { return E_NOTIMPL; }
//+---------------------------------------------------------------------------
//
// OnTranslateMessage
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::OnTranslateMessage(const MSG *pMsg) { return E_NOTIMPL; }
//+---------------------------------------------------------------------------
//
// Pause
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::Pause(DWORD *pdwCookie) { return E_NOTIMPL; }
//+---------------------------------------------------------------------------
//
// Resume
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::Resume(DWORD dwCookie) { return E_NOTIMPL; }
//+---------------------------------------------------------------------------
//
// CreateContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::CreateContext(HIMC *phIMC) { CActiveIMM *pActiveIMM;
if (phIMC == NULL) return E_INVALIDARG;
*phIMC = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->CreateContext(phIMC); }
return Imm32_CreateContext(phIMC); }
//+---------------------------------------------------------------------------
//
// DestroyContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::DestroyContext(HIMC hIMC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->DestroyContext(hIMC); }
return Imm32_DestroyContext(hIMC); }
//+---------------------------------------------------------------------------
//
// AssociateContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::AssociateContext(HWND hWnd, HIMC hIME, HIMC *phPrev) { CActiveIMM *pActiveIMM;
if (phPrev == NULL) return E_INVALIDARG;
*phPrev = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->AssociateContext(hWnd, hIME, phPrev); }
return Imm32_AssociateContext(hWnd, hIME, phPrev); }
//+---------------------------------------------------------------------------
//
// AssociateContextEx
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::AssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->AssociateContextEx(hWnd, hIMC, dwFlags); }
return Imm32_AssociateContextEx(hWnd, hIMC, dwFlags); }
//+---------------------------------------------------------------------------
//
// GetContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetContext(HWND hWnd, HIMC *phIMC) { CActiveIMM *pActiveIMM;
if (phIMC == NULL) return E_INVALIDARG;
*phIMC = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetContext(hWnd, phIMC); }
return Imm32_GetContext(hWnd, phIMC); }
//+---------------------------------------------------------------------------
//
// ReleaseContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::ReleaseContext(HWND hWnd, HIMC hIMC) { return S_OK; }
//+---------------------------------------------------------------------------
//
// GetIMCLockCount
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetIMCLockCount(HIMC hIMC, DWORD *pdwLockCount) { CActiveIMM *pActiveIMM;
if (pdwLockCount == NULL) return E_INVALIDARG;
*pdwLockCount = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetIMCLockCount(hIMC, pdwLockCount); }
return Imm32_GetIMCLockCount(hIMC, pdwLockCount); }
//+---------------------------------------------------------------------------
//
// LockIMC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::LockIMC(HIMC hIMC, INPUTCONTEXT **ppIMC) { CActiveIMM *pActiveIMM;
if (ppIMC == NULL) return E_INVALIDARG;
*ppIMC = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->LockIMC(hIMC, ppIMC); }
return Imm32_LockIMC(hIMC, ppIMC); }
//+---------------------------------------------------------------------------
//
// UnlockIMC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::UnlockIMC(HIMC hIMC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->UnlockIMC(hIMC); }
return Imm32_UnlockIMC(hIMC); }
//+---------------------------------------------------------------------------
//
// CreateIMCC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::CreateIMCC(DWORD dwSize, HIMCC *phIMCC) { CActiveIMM *pActiveIMM;
if (phIMCC == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->CreateIMCC(dwSize, phIMCC); }
return Imm32_CreateIMCC(dwSize, phIMCC); }
//+---------------------------------------------------------------------------
//
// DestroyIMCC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::DestroyIMCC(HIMCC hIMCC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->DestroyIMCC(hIMCC); }
return Imm32_DestroyIMCC(hIMCC); }
//+---------------------------------------------------------------------------
//
// GetIMCCSize
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetIMCCSize(HIMCC hIMCC, DWORD *pdwSize) { CActiveIMM *pActiveIMM;
if (pdwSize == NULL) return E_INVALIDARG;
*pdwSize = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetIMCCSize(hIMCC, pdwSize); }
return Imm32_GetIMCCSize(hIMCC, pdwSize); }
//+---------------------------------------------------------------------------
//
// ReSizeIMCC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::ReSizeIMCC(HIMCC hIMCC, DWORD dwSize, HIMCC *phIMCC) { CActiveIMM *pActiveIMM;
if (phIMCC == NULL) return E_INVALIDARG;
*phIMCC = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->ReSizeIMCC(hIMCC, dwSize, phIMCC); }
return Imm32_ReSizeIMCC(hIMCC, dwSize, phIMCC); }
//+---------------------------------------------------------------------------
//
// GetIMCCLockCount
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetIMCCLockCount(HIMCC hIMCC, DWORD *pdwLockCount) { CActiveIMM *pActiveIMM;
if (pdwLockCount == NULL) return E_INVALIDARG;
*pdwLockCount = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetIMCCLockCount(hIMCC, pdwLockCount); }
return Imm32_GetIMCCLockCount(hIMCC, pdwLockCount); }
//+---------------------------------------------------------------------------
//
// LockIMCC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::LockIMCC(HIMCC hIMCC, void **ppv) { CActiveIMM *pActiveIMM;
if (ppv == NULL) return E_INVALIDARG;
*ppv = NULL;
if (pActiveIMM = GetTLS()) { return pActiveIMM->LockIMCC(hIMCC, ppv); }
return Imm32_LockIMCC(hIMCC, ppv); }
//+---------------------------------------------------------------------------
//
// UnlockIMCC
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::UnlockIMCC(HIMCC hIMCC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->UnlockIMCC(hIMCC); }
return Imm32_UnlockIMCC(hIMCC); }
//+---------------------------------------------------------------------------
//
// GetOpenStatus
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetOpenStatus(HIMC hIMC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetOpenStatus(hIMC); }
return Imm32_GetOpenStatus(hIMC); }
//+---------------------------------------------------------------------------
//
// SetOpenStatus
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetOpenStatus(HIMC hIMC, BOOL fOpen) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetOpenStatus(hIMC, fOpen); }
return Imm32_SetOpenStatus(hIMC, fOpen); }
//+---------------------------------------------------------------------------
//
// GetConversionStatus
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetConversionStatus(HIMC hIMC, DWORD *lpfdwConversion, DWORD *lpfdwSentence) { CActiveIMM *pActiveIMM;
if (lpfdwConversion != NULL) { *lpfdwConversion = 0; } if (lpfdwSentence != NULL) { *lpfdwSentence = 0; } if (lpfdwConversion == NULL || lpfdwSentence == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetConversionStatus(hIMC, lpfdwConversion, lpfdwSentence); }
return Imm32_GetConversionStatus(hIMC, lpfdwConversion, lpfdwSentence); }
//+---------------------------------------------------------------------------
//
// SetConversionStatus
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetConversionStatus(hIMC, fdwConversion, fdwSentence); }
return Imm32_SetConversionStatus(hIMC, fdwConversion, fdwSentence); }
//+---------------------------------------------------------------------------
//
// GetStatusWindowPos
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetStatusWindowPos(HIMC hIMC, POINT *lpptPos) { CActiveIMM *pActiveIMM;
if (lpptPos == NULL) return E_INVALIDARG;
memset(lpptPos, 0, sizeof(POINT));
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetStatusWindowPos(hIMC, lpptPos); }
return Imm32_GetStatusWindowPos(hIMC, lpptPos); }
//+---------------------------------------------------------------------------
//
// SetStatusWindowPos
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetStatusWindowPos(HIMC hIMC, POINT *lpptPos) { CActiveIMM *pActiveIMM;
if (lpptPos == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetStatusWindowPos(hIMC, lpptPos); }
return Imm32_SetStatusWindowPos(hIMC, lpptPos); }
//+---------------------------------------------------------------------------
//
// GetCompositionStringA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCompositionStringA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf) { CActiveIMM *pActiveIMM;
if (plCopied == NULL) return E_INVALIDARG;
*plCopied = 0;
if (dwBufLen > 0 && lpBuf == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCompositionStringA(hIMC, dwIndex, dwBufLen, plCopied, lpBuf); }
return Imm32_GetCompositionString(hIMC, dwIndex, dwBufLen, plCopied, lpBuf, FALSE); }
//+---------------------------------------------------------------------------
//
// GetCompositionStringW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCompositionStringW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf) { CActiveIMM *pActiveIMM;
if (plCopied == NULL) return E_INVALIDARG;
*plCopied = 0;
if (dwBufLen > 0 && lpBuf == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCompositionStringW(hIMC, dwIndex, dwBufLen, plCopied, lpBuf); }
return Imm32_GetCompositionString(hIMC, dwIndex, dwBufLen, plCopied, lpBuf, TRUE); }
//+---------------------------------------------------------------------------
//
// SetCompositionStringA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen) { CActiveIMM *pActiveIMM;
if ((dwIndex & (SCS_SETSTR | SCS_CHANGEATTR | SCS_CHANGECLAUSE | SCS_SETRECONVERTSTRING | SCS_QUERYRECONVERTSTRING)) == 0) return E_INVALIDARG;
if (lpComp == NULL && lpRead == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCompositionStringA(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); }
return Imm32_SetCompositionString(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen, FALSE); }
//+---------------------------------------------------------------------------
//
// SetCompositionStringW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen) { CActiveIMM *pActiveIMM;
if ((dwIndex & (SCS_SETSTR | SCS_CHANGEATTR | SCS_CHANGECLAUSE | SCS_SETRECONVERTSTRING | SCS_QUERYRECONVERTSTRING)) == 0) return E_INVALIDARG;
if (lpComp == NULL && lpRead == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCompositionStringW(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); }
return Imm32_SetCompositionString(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen, TRUE); }
//+---------------------------------------------------------------------------
//
// GetCompositionFontA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCompositionFontA(HIMC hIMC, LOGFONTA *lplf) { CActiveIMM *pActiveIMM;
if (lplf == NULL) return E_INVALIDARG;
memset(lplf, 0, sizeof(LOGFONTA));
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCompositionFontA(hIMC, lplf); }
return Imm32_GetCompositionFont(hIMC, (LOGFONTAW *)lplf, FALSE); }
//+---------------------------------------------------------------------------
//
// GetCompositionFontW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCompositionFontW(HIMC hIMC, LOGFONTW *lplf) { CActiveIMM *pActiveIMM;
if (lplf == NULL) return E_INVALIDARG;
memset(lplf, 0, sizeof(LOGFONTW));
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCompositionFontW(hIMC, lplf); }
return Imm32_GetCompositionFont(hIMC, (LOGFONTAW *)lplf, TRUE); }
//+---------------------------------------------------------------------------
//
// SetCompositionFontA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCompositionFontA(HIMC hIMC, LOGFONTA *lplf) { CActiveIMM *pActiveIMM;
if (lplf == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCompositionFontA(hIMC, lplf); }
return Imm32_SetCompositionFont(hIMC, (LOGFONTAW *)lplf, FALSE); }
//+---------------------------------------------------------------------------
//
// SetCompositionFontW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCompositionFontW(HIMC hIMC, LOGFONTW *lplf) { CActiveIMM *pActiveIMM;
if (lplf == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCompositionFontW(hIMC, lplf); }
return Imm32_SetCompositionFont(hIMC, (LOGFONTAW *)lplf, TRUE); }
//+---------------------------------------------------------------------------
//
// GetCompositionWindow
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm) { CActiveIMM *pActiveIMM;
if (lpCompForm == NULL) return E_INVALIDARG;
memset(lpCompForm, 0, sizeof(COMPOSITIONFORM));
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCompositionWindow(hIMC, lpCompForm); }
return Imm32_GetCompositionWindow(hIMC, lpCompForm); }
//+---------------------------------------------------------------------------
//
// SetCompositionWindow
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm) { CActiveIMM *pActiveIMM;
if (lpCompForm == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCompositionWindow(hIMC, lpCompForm); }
return Imm32_SetCompositionWindow(hIMC, lpCompForm); }
//+---------------------------------------------------------------------------
//
// GetCandidateListA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCandidateListA(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; } if (uBufLen > 0 && lpCandList != NULL) { memset(lpCandList, 0, uBufLen); }
if (puCopied == NULL) return E_INVALIDARG; if (uBufLen > 0 && lpCandList == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCandidateListA(hIMC, dwIndex, uBufLen, lpCandList, puCopied); }
return Imm32_GetCandidateList(hIMC, dwIndex, uBufLen, lpCandList, puCopied, FALSE); }
//+---------------------------------------------------------------------------
//
// GetCandidateListW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCandidateListW(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; } if (uBufLen > 0 && lpCandList != NULL) { memset(lpCandList, 0, uBufLen); }
if (puCopied == NULL) return E_INVALIDARG; if (uBufLen > 0 && lpCandList == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCandidateListW(hIMC, dwIndex, uBufLen, lpCandList, puCopied); }
return Imm32_GetCandidateList(hIMC, dwIndex, uBufLen, lpCandList, puCopied, TRUE); }
//+---------------------------------------------------------------------------
//
// GetCandidateListCountA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCandidateListCountA(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen) { CActiveIMM *pActiveIMM;
if (lpdwListSize != NULL) { *lpdwListSize = 0; } if (pdwBufLen != NULL) { *pdwBufLen = 0; } if (lpdwListSize == NULL || pdwBufLen == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCandidateListCountA(hIMC, lpdwListSize, pdwBufLen); }
return Imm32_GetCandidateListCount(hIMC, lpdwListSize, pdwBufLen, FALSE); }
//+---------------------------------------------------------------------------
//
// GetCandidateListCountW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCandidateListCountW(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen) { CActiveIMM *pActiveIMM;
if (lpdwListSize != NULL) { *lpdwListSize = 0; } if (pdwBufLen != NULL) { *pdwBufLen = 0; } if (lpdwListSize == NULL || pdwBufLen == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCandidateListCountW(hIMC, lpdwListSize, pdwBufLen); }
return Imm32_GetCandidateListCount(hIMC, lpdwListSize, pdwBufLen, TRUE); }
//+---------------------------------------------------------------------------
//
// GetCandidateWindow
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetCandidateWindow(HIMC hIMC, DWORD dwBufLen, CANDIDATEFORM *lpCandidate) { CActiveIMM *pActiveIMM;
if (lpCandidate == NULL) return E_INVALIDARG;
memset(lpCandidate, 0, dwBufLen);
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetCandidateWindow(hIMC, dwBufLen, lpCandidate); }
return Imm32_GetCandidateWindow(hIMC, dwBufLen, lpCandidate); }
//+---------------------------------------------------------------------------
//
// SetCandidateWindow
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetCandidateWindow(HIMC hIMC, CANDIDATEFORM *lpCandidate) { CActiveIMM *pActiveIMM;
if (lpCandidate == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetCandidateWindow(hIMC, lpCandidate); }
return Imm32_SetCandidateWindow(hIMC, lpCandidate); }
//+---------------------------------------------------------------------------
//
// GetGuideLineA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetGuideLineA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPSTR pBuf, DWORD *pdwResult) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetGuideLineA(hIMC, dwIndex, dwBufLen, pBuf, pdwResult); }
return Imm32_GetGuideLine(hIMC, dwIndex, dwBufLen, (CHARAW *)pBuf, pdwResult, FALSE); }
//+---------------------------------------------------------------------------
//
// GetGuideLineW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetGuideLineW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPWSTR pBuf, DWORD *pdwResult) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetGuideLineW(hIMC, dwIndex, dwBufLen, pBuf, pdwResult); }
return Imm32_GetGuideLine(hIMC, dwIndex, dwBufLen, (CHARAW *)pBuf, pdwResult, TRUE); }
//+---------------------------------------------------------------------------
//
// NotifyIME
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->NotifyIME(hIMC, dwAction, dwIndex, dwValue); }
return Imm32_NotifyIME(hIMC, dwAction, dwIndex, dwValue); }
//+---------------------------------------------------------------------------
//
// GetImeMenuItemsA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetImeMenuItemsA(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOA *pImeParentMenu, IMEMENUITEMINFOA *pImeMenu, DWORD dwSize, DWORD *pdwResult) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetImeMenuItemsA(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, dwSize, pdwResult); }
return Imm32_GetImeMenuItems(hIMC, dwFlags, dwType, (IMEMENUITEMINFOAW *)pImeParentMenu, (IMEMENUITEMINFOAW *)pImeMenu, dwSize, pdwResult, FALSE); }
//+---------------------------------------------------------------------------
//
// GetImeMenuItemsW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetImeMenuItemsW(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOW *pImeParentMenu, IMEMENUITEMINFOW *pImeMenu, DWORD dwSize, DWORD *pdwResult) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetImeMenuItemsW(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, dwSize, pdwResult); }
return Imm32_GetImeMenuItems(hIMC, dwFlags, dwType, (IMEMENUITEMINFOAW *)pImeParentMenu, (IMEMENUITEMINFOAW *)pImeMenu, dwSize, pdwResult, TRUE); }
//+---------------------------------------------------------------------------
//
// RegisterWordA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::RegisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszRegister) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->RegisterWordA(hKL, lpszReading, dwStyle, lpszRegister); }
return Imm32_RegisterWordA(hKL, lpszReading, dwStyle, lpszRegister); }
//+---------------------------------------------------------------------------
//
// RegisterWordW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::RegisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszRegister) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->RegisterWordW(hKL, lpszReading, dwStyle, lpszRegister); }
return Imm32_RegisterWordW(hKL, lpszReading, dwStyle, lpszRegister); }
//+---------------------------------------------------------------------------
//
// UnregisterWordA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::UnregisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszUnregister) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->UnregisterWordA(hKL, lpszReading, dwStyle, lpszUnregister); }
return Imm32_UnregisterWordA(hKL, lpszReading, dwStyle, lpszUnregister); }
//+---------------------------------------------------------------------------
//
// UnregisterWordW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::UnregisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszUnregister) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->UnregisterWordW(hKL, lpszReading, dwStyle, lpszUnregister); }
return Imm32_UnregisterWordW(hKL, lpszReading, dwStyle, lpszUnregister); }
//+---------------------------------------------------------------------------
//
// EnumRegisterWordA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::EnumRegisterWordA(HKL hKL, LPSTR szReading, DWORD dwStyle, LPSTR szRegister, LPVOID lpData, IEnumRegisterWordA **ppEnum) { if (ppEnum != NULL) { *ppEnum = NULL; }
CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->EnumRegisterWordA(hKL, szReading, dwStyle, szRegister, lpData, ppEnum); }
return Imm32_EnumRegisterWordA(hKL, szReading, dwStyle, szRegister, lpData, ppEnum); }
//+---------------------------------------------------------------------------
//
// EnumRegisterWordW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::EnumRegisterWordW(HKL hKL, LPWSTR szReading, DWORD dwStyle, LPWSTR szRegister, LPVOID lpData, IEnumRegisterWordW **ppEnum) { if (ppEnum != NULL) { *ppEnum = NULL; }
CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->EnumRegisterWordW(hKL, szReading, dwStyle, szRegister, lpData, ppEnum); }
return Imm32_EnumRegisterWordW(hKL, szReading, dwStyle, szRegister, lpData, ppEnum); }
//+---------------------------------------------------------------------------
//
// GetRegisterWordStyleA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetRegisterWordStyleA(HKL hKL, UINT nItem, STYLEBUFA *lpStyleBuf, UINT *puCopied) { if (puCopied != NULL) { *puCopied = 0; }
CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetRegisterWordStyleA(hKL, nItem, lpStyleBuf, puCopied); }
return Imm32_GetRegisterWordStyleA(hKL, nItem, lpStyleBuf, puCopied); }
//+---------------------------------------------------------------------------
//
// GetRegisterWordStyleW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetRegisterWordStyleW(HKL hKL, UINT nItem, STYLEBUFW *lpStyleBuf, UINT *puCopied) { if (puCopied != NULL) { *puCopied = 0; }
CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetRegisterWordStyleW(hKL, nItem, lpStyleBuf, puCopied); }
return Imm32_GetRegisterWordStyleW(hKL, nItem, lpStyleBuf, puCopied); }
//+---------------------------------------------------------------------------
//
// ConfigureIMEA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::ConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDA *lpdata) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->ConfigureIMEA(hKL, hWnd, dwMode, lpdata); }
return Imm32_ConfigureIMEA(hKL, hWnd, dwMode, lpdata); }
//+---------------------------------------------------------------------------
//
// ConfigureIMEW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::ConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *lpdata) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->ConfigureIMEW(hKL, hWnd, dwMode, lpdata); }
return Imm32_ConfigureIMEW(hKL, hWnd, dwMode, lpdata); }
//+---------------------------------------------------------------------------
//
// GetDescriptionA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetDescriptionA(HKL hKL, UINT uBufLen, LPSTR lpszDescription, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetDescriptionA(hKL, uBufLen, lpszDescription, puCopied); }
return GetDescriptionA(hKL, uBufLen, lpszDescription, puCopied); }
//+---------------------------------------------------------------------------
//
// GetDescriptionW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetDescriptionW(HKL hKL, UINT uBufLen, LPWSTR lpszDescription, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetDescriptionW(hKL, uBufLen, lpszDescription, puCopied); }
return Imm32_GetDescriptionW(hKL, uBufLen, lpszDescription, puCopied); }
//+---------------------------------------------------------------------------
//
// GetIMEFileNameA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetIMEFileNameA(HKL hKL, UINT uBufLen, LPSTR lpszFileName, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetIMEFileNameA(hKL, uBufLen, lpszFileName, puCopied); }
return Imm32_GetIMEFileNameA(hKL, uBufLen, lpszFileName, puCopied); }
//+---------------------------------------------------------------------------
//
// GetIMEFileNameW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetIMEFileNameW(HKL hKL, UINT uBufLen, LPWSTR lpszFileName, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetIMEFileNameW(hKL, uBufLen, lpszFileName, puCopied); }
return Imm32_GetIMEFileNameW(hKL, uBufLen, lpszFileName, puCopied); }
//+---------------------------------------------------------------------------
//
// InstallIMEA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::InstallIMEA(LPSTR lpszIMEFileName, LPSTR lpszLayoutText, HKL *phKL) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->InstallIMEA(lpszIMEFileName, lpszLayoutText, phKL); }
return Imm32_InstallIMEA(lpszIMEFileName, lpszLayoutText, phKL); }
//+---------------------------------------------------------------------------
//
// InstallIMEW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::InstallIMEW(LPWSTR lpszIMEFileName, LPWSTR lpszLayoutText, HKL *phKL) { CActiveIMM *pActiveIMM;
// consider: check params
if (pActiveIMM = GetTLS()) { return pActiveIMM->InstallIMEW(lpszIMEFileName, lpszLayoutText, phKL); }
return Imm32_InstallIMEW(lpszIMEFileName, lpszLayoutText, phKL); }
//+---------------------------------------------------------------------------
//
// GetProperty
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetProperty(HKL hKL, DWORD fdwIndex, DWORD *pdwProperty) { CActiveIMM *pActiveIMM;
if (pdwProperty == NULL) return E_INVALIDARG;
*pdwProperty = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetProperty(hKL, fdwIndex, pdwProperty); }
return Imm32_GetProperty(hKL, fdwIndex, pdwProperty); }
//+---------------------------------------------------------------------------
//
// IsIME
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::IsIME(HKL hKL) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->IsIME(hKL); }
return Imm32_IsIME(hKL); }
//+---------------------------------------------------------------------------
//
// EscapeA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::EscapeA(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult) { CActiveIMM *pActiveIMM;
if (plResult == NULL) return E_INVALIDARG;
*plResult = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->EscapeA(hKL, hIMC, uEscape, lpData, plResult); }
return Imm32_Escape(hKL, hIMC, uEscape, lpData, plResult, FALSE); }
//+---------------------------------------------------------------------------
//
// EscapeW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::EscapeW(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult) { CActiveIMM *pActiveIMM;
if (plResult == NULL) return E_INVALIDARG;
*plResult = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->EscapeW(hKL, hIMC, uEscape, lpData, plResult); }
return Imm32_Escape(hKL, hIMC, uEscape, lpData, plResult, TRUE); }
//+---------------------------------------------------------------------------
//
// GetConversionListA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetConversionListA(HKL hKL, HIMC hIMC, LPSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetConversionListA(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied); }
return Imm32_GetConversionListA(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied); }
//+---------------------------------------------------------------------------
//
// GetConversionListW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetConversionListW(HKL hKL, HIMC hIMC, LPWSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied) { CActiveIMM *pActiveIMM;
if (puCopied != NULL) { *puCopied = 0; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetConversionListW(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied); }
return Imm32_GetConversionListW(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied); }
//+---------------------------------------------------------------------------
//
// GetDefaultIMEWnd
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetDefaultIMEWnd(HWND hWnd, HWND *phDefWnd) { CActiveIMM *pActiveIMM;
if (phDefWnd == NULL) return E_INVALIDARG;
*phDefWnd = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetDefaultIMEWnd(hWnd, phDefWnd); }
return Imm32_GetDefaultIMEWnd(hWnd, phDefWnd); }
//+---------------------------------------------------------------------------
//
// GetVirtualKey
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetVirtualKey(HWND hWnd, UINT *puVirtualKey) { CActiveIMM *pActiveIMM;
if (puVirtualKey == NULL) return E_INVALIDARG;
*puVirtualKey = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetVirtualKey(hWnd, puVirtualKey); }
return Imm32_GetVirtualKey(hWnd, puVirtualKey); }
//+---------------------------------------------------------------------------
//
// IsUIMessageA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::IsUIMessageA(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->IsUIMessageA(hWndIME, msg, wParam, lParam); }
return Imm32_IsUIMessageA(hWndIME, msg, wParam, lParam); }
//+---------------------------------------------------------------------------
//
// IsUIMessageW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::IsUIMessageW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->IsUIMessageW(hWndIME, msg, wParam, lParam); }
return Imm32_IsUIMessageW(hWndIME, msg, wParam, lParam); }
//+---------------------------------------------------------------------------
//
// GenerateMessage
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GenerateMessage(HIMC hIMC) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GenerateMessage(hIMC); }
return Imm32_GenerateMessage(hIMC); }
//+---------------------------------------------------------------------------
//
// GetHotKey
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetHotKey(DWORD dwHotKeyID, UINT *puModifiers, UINT *puVKey, HKL *phKL) { CActiveIMM *pActiveIMM;
if (puModifiers != NULL) { *puModifiers = 0; } if (puVKey != NULL) { *puVKey = 0; } if (phKL != NULL) { *phKL = 0; } if (puModifiers == NULL || puVKey == NULL || phKL == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) { return pActiveIMM->GetHotKey(dwHotKeyID, puModifiers, puVKey, phKL); }
return Imm32_GetHotKey(dwHotKeyID, puModifiers, puVKey, phKL); }
//+---------------------------------------------------------------------------
//
// SetHotKey
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetHotKey(DWORD dwHotKeyID, UINT uModifiers, UINT uVKey, HKL hKL) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SetHotKey(dwHotKeyID, uModifiers, uVKey, hKL); }
return Imm32_SetHotKey(dwHotKeyID, uModifiers, uVKey, hKL); }
//+---------------------------------------------------------------------------
//
// SimulateHotKey
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SimulateHotKey(HWND hWnd, DWORD dwHotKeyID) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->SimulateHotKey(hWnd, dwHotKeyID); }
return Imm32_SimulateHotKey(hWnd, dwHotKeyID); }
//+---------------------------------------------------------------------------
//
// CreateSoftKeyboard
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::CreateSoftKeyboard(UINT uType, HWND hOwner, int x, int y, HWND *phSoftKbdWnd) { if (phSoftKbdWnd != NULL) { *phSoftKbdWnd = 0; } return Imm32_CreateSoftKeyboard(uType, hOwner, x, y, phSoftKbdWnd); }
//+---------------------------------------------------------------------------
//
// DestroySoftKeyboard
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::DestroySoftKeyboard(HWND hSoftKbdWnd) { return Imm32_DestroySoftKeyboard(hSoftKbdWnd); }
//+---------------------------------------------------------------------------
//
// ShowSoftKeyboard
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::ShowSoftKeyboard(HWND hSoftKbdWnd, int nCmdShow) { return Imm32_ShowSoftKeyboard(hSoftKbdWnd, nCmdShow); }
//+---------------------------------------------------------------------------
//
// DisableIME
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::DisableIME(DWORD idThread) { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->DisableIME(idThread); }
return Imm32_DisableIME(idThread); }
//+---------------------------------------------------------------------------
//
// RequestMessageA
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::RequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { CActiveIMM *pActiveIMM;
if (plResult == NULL) return E_INVALIDARG;
*plResult = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->RequestMessageA(hIMC, wParam, lParam, plResult); }
return Imm32_RequestMessageA(hIMC, wParam, lParam, plResult); }
//+---------------------------------------------------------------------------
//
// RequestMessageW
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::RequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { CActiveIMM *pActiveIMM;
if (plResult == NULL) return E_INVALIDARG;
*plResult = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->RequestMessageW(hIMC, wParam, lParam, plResult); }
return Imm32_RequestMessageW(hIMC, wParam, lParam, plResult); }
//+---------------------------------------------------------------------------
//
// EnumInputContext
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::EnumInputContext(DWORD idThread, IEnumInputContext **ppEnum) { CActiveIMM *pActiveIMM;
if (ppEnum != NULL) { *ppEnum = NULL; }
if (pActiveIMM = GetTLS()) { return pActiveIMM->EnumInputContext(idThread, ppEnum); }
Assert(0); return E_NOTIMPL; // consider: need code to wrap up HIMC's into enumerator
}
//+---------------------------------------------------------------------------
//
// Activate
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::Activate(BOOL fRestoreLayout) { PENDINGFILTER *pPending; PENDINGFILTERGUIDMAP *pPendingGuidMap; PENDINGFILTEREX *pPendingEx; IMTLS *ptls; CActiveIMM *pActiveIMM; HRESULT hr; BOOL fInitedTLS = FALSE;
if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL;
// init the tls
if ((pActiveIMM = ptls->pActiveIMM) == NULL) { if ((pActiveIMM = new CActiveIMM) == NULL) return E_OUTOFMEMORY;
if (FAILED(hr=pActiveIMM->_Init()) || FAILED(hr=IMTLS_SetActiveIMM(pActiveIMM) ? S_OK : E_FAIL)) { delete pActiveIMM; return hr; }
fInitedTLS = TRUE;
// handle any calls to FilterClientWindows that preceded the activate call
// consider: is it safe to limit filter list to per-thread? Shouldn't this be per-process
// to make trident happy?
while (ptls->pPendingFilterClientWindows != NULL) { ptls->pActiveIMM->FilterClientWindows(ptls->pPendingFilterClientWindows->rgAtoms, ptls->pPendingFilterClientWindows->uSize, ptls->pPendingFilterClientWindowsGuidMap->rgGuidMap);
pPending = ptls->pPendingFilterClientWindows->pNext; cicMemFree(ptls->pPendingFilterClientWindows); ptls->pPendingFilterClientWindows = pPending;
pPendingGuidMap = ptls->pPendingFilterClientWindowsGuidMap->pNext; cicMemFree(ptls->pPendingFilterClientWindowsGuidMap); ptls->pPendingFilterClientWindowsGuidMap = pPendingGuidMap; } while (ptls->pPendingFilterClientWindowsEx != NULL) { ptls->pActiveIMM->FilterClientWindowsEx(ptls->pPendingFilterClientWindowsEx->hWnd, ptls->pPendingFilterClientWindowsEx->fGuidMap);
pPendingEx = ptls->pPendingFilterClientWindowsEx->pNext; cicMemFree(ptls->pPendingFilterClientWindowsEx); ptls->pPendingFilterClientWindowsEx = pPendingEx; } }
hr = pActiveIMM->Activate(fRestoreLayout);
if (fInitedTLS) { // the first Activate call on this thread will do an internal AddRef
// on success, so we must release
pActiveIMM->Release(); }
return hr; }
//+---------------------------------------------------------------------------
//
// Deactivate
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::Deactivate() { CActiveIMM *pActiveIMM;
if (pActiveIMM = GetTLS()) { return pActiveIMM->Deactivate(); }
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// OnDefWindowProc
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::OnDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { CActiveIMM *pActiveIMM;
if (plResult == NULL) return E_INVALIDARG;
*plResult = 0;
if (pActiveIMM = GetTLS()) { return pActiveIMM->OnDefWindowProc(hWnd, Msg, wParam, lParam, plResult); }
return S_FALSE; }
//+---------------------------------------------------------------------------
//
// FilterClientWindows
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::FilterClientWindows(ATOM *aaWindowClasses, UINT uSize) { return FilterClientWindowsGUIDMap(aaWindowClasses, uSize, NULL); }
STDAPI CProcessIMM::FilterClientWindowsGUIDMap(ATOM *aaWindowClasses, UINT uSize, BOOL *aaGuidMap) { IMTLS *ptls; PENDINGFILTER *pPending; PENDINGFILTERGUIDMAP *pPendingGuidMap; if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL;
if (ptls->pActiveIMM != NULL) { return ptls->pActiveIMM->FilterClientWindows(aaWindowClasses, uSize, aaGuidMap); }
// Activate hasn't been called yet on this thread
// need to handle the call later
pPending = (PENDINGFILTER *)cicMemAlloc(sizeof(PENDINGFILTER)+uSize*sizeof(ATOM)-sizeof(ATOM)); if (pPending == NULL) return E_OUTOFMEMORY;
pPendingGuidMap = (PENDINGFILTERGUIDMAP *)cicMemAlloc(sizeof(PENDINGFILTERGUIDMAP)+uSize*sizeof(BOOL)-sizeof(BOOL)); if (pPendingGuidMap == NULL) { cicMemFree(pPending); return E_OUTOFMEMORY; }
pPending->uSize = uSize; memcpy(pPending->rgAtoms, aaWindowClasses, uSize*sizeof(ATOM));
pPendingGuidMap->uSize = uSize; if (aaGuidMap) { memcpy(pPendingGuidMap->rgGuidMap, aaGuidMap, uSize*sizeof(BOOL)); } else { memset(pPendingGuidMap->rgGuidMap, FALSE, uSize*sizeof(BOOL)); }
pPending->pNext = ptls->pPendingFilterClientWindows; ptls->pPendingFilterClientWindows = pPending;
pPendingGuidMap->pNext = ptls->pPendingFilterClientWindowsGuidMap; ptls->pPendingFilterClientWindowsGuidMap = pPendingGuidMap;
return S_OK; }
//+---------------------------------------------------------------------------
//
// FilterClientWindowsEx
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::FilterClientWindowsEx(HWND hWnd, BOOL fGuidMap) { IMTLS *ptls; PENDINGFILTEREX *pPending; if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL;
if (ptls->pActiveIMM != NULL) { return ptls->pActiveIMM->FilterClientWindowsEx(hWnd, fGuidMap); }
// Activate hasn't been called yet on this thread
// need to handle the call later
pPending = (PENDINGFILTEREX *)cicMemAlloc(sizeof(PENDINGFILTEREX));
if (pPending == NULL) return E_OUTOFMEMORY;
pPending->hWnd = hWnd; pPending->fGuidMap = fGuidMap;
pPending->pNext = ptls->pPendingFilterClientWindowsEx; ptls->pPendingFilterClientWindowsEx = pPending;
return S_OK; }
//+---------------------------------------------------------------------------
//
// GetGuidAtom
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetGuidAtom(HIMC hImc, BYTE bAttr, TfGuidAtom *pGuidAtom) { IMTLS *ptls; if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL;
if (ptls->pActiveIMM != NULL) { return ptls->pActiveIMM->GetGuidAtom(hImc, bAttr, pGuidAtom); }
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// UnfilterClientWindowsEx
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::UnfilterClientWindowsEx(HWND hWnd) { IMTLS *ptls; if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL;
if (ptls->pActiveIMM != NULL) { return ptls->pActiveIMM->UnfilterClientWindowsEx(hWnd); }
// Activate hasn't been called yet on this thread
// need to remove a handle from the waiting list
PENDINGFILTEREX *current = ptls->pPendingFilterClientWindowsEx; PENDINGFILTEREX *previous = NULL;
while (current != NULL) { if (current->hWnd == hWnd) { PENDINGFILTEREX *pv; pv = current->pNext; cicMemFree(current);
if (previous == NULL) ptls->pPendingFilterClientWindowsEx = pv; else previous->pNext = pv;
current = pv; } else { previous = current; current = current->pNext; } }
return S_OK; }
//+---------------------------------------------------------------------------
//
// GetCodePageA
//
//----------------------------------------------------------------------------
extern UINT GetCodePageFromLangId(LCID lcid);
STDAPI CProcessIMM::GetCodePageA(HKL hKL, UINT *puCodePage)
/*++
Method:
IActiveIMMApp::GetCodePageA IActiveIMMIME::GetCodePageA
Routine Description:
Retrieves the code page associated with the given keyboard layout.
Arguments:
hKL - [in] Handle to the keyboard layout. puCodePage - [out] Address of an unsigned integer that receives the code page identifier associated with the keyboard.
Return Value:
Returns S_OK if successful, or an error code otherwise.
--*/
{ if (puCodePage == NULL) return E_INVALIDARG;
*puCodePage = CP_ACP;
TraceMsg(TF_API, "CProcessIMM::GetCodePageA");
if (_IsValidKeyboardLayout(hKL)) { *puCodePage = ::GetCodePageFromLangId(LOWORD(hKL)); return S_OK; }
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// GetLangId
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetLangId(HKL hKL, LANGID *plid)
/*++
Method:
IActiveIMMApp::GetLangId IActiveIMMIME::GetLangId
Routine Description:
Retrieves the language identifier associated with the given keyboard layout.
Arguments:
hKL - [in] Handle to the keyboard layout. plid - [out] Address of the LANGID associated with the keyboard layout.
Return Value:
Returns S_OK if successful, or an error code otherwise.
--*/
{ if (plid == NULL) return E_INVALIDARG;
*plid = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
TraceMsg(TF_API, "CProcessIMM::GetLangId");
if (_IsValidKeyboardLayout(hKL)) { *plid = LOWORD(hKL); return S_OK; }
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// QueryService
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::QueryService(REFGUID guidService, REFIID riid, void **ppv) { CActiveIMM *pActiveIMM;
if (ppv == NULL) return E_INVALIDARG;
*ppv = NULL;
if (pActiveIMM = GetTLS()) { return pActiveIMM->QueryService(guidService, riid, ppv); }
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// SetThreadCompartmentValue
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::SetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar) { CActiveIMM *pActiveIMM;
if (pvar == NULL) return E_INVALIDARG;
if (pActiveIMM = GetTLS()) return pActiveIMM->SetThreadCompartmentValue(rguid, pvar);
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// GetThreadCompartmentValue
//
//----------------------------------------------------------------------------
STDAPI CProcessIMM::GetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar) { CActiveIMM *pActiveIMM;
if (pvar == NULL) return E_INVALIDARG;
QuickVariantInit(pvar);
if (pActiveIMM = GetTLS()) return pActiveIMM->GetThreadCompartmentValue(rguid, pvar);
return E_FAIL; }
|