////////////////////////////////////////////////////////////////// // File : cpadsvr.cpp // Purpose : // // // Date : Fri Apr 16 15:39:33 1999 // Author : ToshiaK // // Copyright(c) 1995-1999, Microsoft Corp. All rights reserved ////////////////////////////////////////////////////////////////// #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #ifdef UNDER_CE // stub for CE #include "stub_ce.h" #endif // UNDER_CE #include "imepadsv.h" #include "cpadsvrc.h" #include "cpadcb.h" #include "cpaddbg.h" //---------------------------------------------------------------- //misc definition //---------------------------------------------------------------- #define Unref(a) UNREFERENCED_PARAMETER(a) //990812:ToshiaK For Win64. Use Global Alloc/Free Ptr. #include #define MemAlloc(a) GlobalAllocPtr(GMEM_FIXED, a) #define MemFree(a) GlobalFreePtr(a) inline LPVOID WinSetUserPtr(HWND hwnd, LPVOID lpVoid) { #ifdef _WIN64 return (LPVOID)SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lpVoid); #else return (LPVOID)SetWindowLong(hwnd, GWL_USERDATA, (LONG)lpVoid); #endif } inline LPVOID WinGetUserPtr(HWND hwnd) { #ifdef _WIN64 return (LPVOID)GetWindowLongPtr(hwnd, GWLP_USERDATA); #else return (LPVOID)GetWindowLong(hwnd, GWL_USERDATA); #endif } //---------------------------------------------------------------- // //public method decalre // //---------------------------------------------------------------- CImePadSvrCOM::CImePadSvrCOM(VOID) { Dbg(("CImePadSvrCOM::CImePadSvrCOM() constructor START\n")); m_fShowReqStatus = FALSE; m_fLastActiveCtx = FALSE; m_hwndIF = NULL; m_lpIUnkIImeIPoint = NULL; m_lpIUnkIImeCallback= NULL; m_lpIImePadServer = NULL; m_lpCImePadCallback = NULL; m_dwRegAdvise = 0; m_fCoInitSuccess = FALSE; Dbg(("CImePadSvrCOM::CImePadSvrCOM() constructor END\n")); } CImePadSvrCOM::~CImePadSvrCOM(VOID) { Dbg(("CImePadSvrCOM::CImePadSvrCOM() Destructor START\n")); this->TermOleAPI(); this->DestroyIFHWND(TRUE); m_fShowReqStatus = FALSE; m_fLastActiveCtx = FALSE; m_hwndIF = NULL; m_lpIUnkIImeIPoint = NULL; m_lpIUnkIImeCallback= NULL; m_lpIImePadServer = NULL; m_lpCImePadCallback = NULL; m_dwRegAdvise = 0; m_fCoInitSuccess = FALSE; Dbg(("CImePadSvrCOM::CImePadSvrCOM() Destructor END\n")); } INT CImePadSvrCOM::ForceDisConnect(VOID) { Dbg(("CImePadSvrCOM::ForceDisConnect START\n")); if(m_lpIImePadServer) { m_lpIImePadServer = NULL; if(m_lpCImePadCallback) { m_lpCImePadCallback->Release(); m_lpCImePadCallback = NULL; } } this->DestroyIFHWND(TRUE); Dbg(("CImePadSvrCOM::ForceDisConnect END\n")); return 0; } BOOL CImePadSvrCOM::IsCoInitialized(VOID) { return m_fCoInitSuccess; } BOOL CImePadSvrCOM::IsAvailable(VOID) { return TRUE; } BOOL CImePadSvrCOM::OnIMEPadClose(VOID) { m_fShowReqStatus = FALSE; return 0; } INT CImePadSvrCOM::Initialize(LANGID imeLangID, DWORD dwImeInputID, LPVOID lpVoid) { HRESULT hr; if(!this->InitOleAPI()) { return -1; } if(!m_fCoInitSuccess) { hr = (*m_fnCoInitialize)(NULL); if(hr == S_OK) { m_fCoInitSuccess = TRUE; } } if(m_lpIImePadServer) { Dbg(("CImePadSvrCOM::Initialize() already Initialized\n")); return 0; } if(!m_fnCoCreateInstance) { return -1; } hr = (*m_fnCoCreateInstance)(CLSID_IImePadServerComponent, NULL, CLSCTX_LOCAL_SERVER, IID_IImePadServer, (LPVOID *)&m_lpIImePadServer); if(!SUCCEEDED(hr)) { Dbg(("CImePadSvrCOM::Initialize() Error[0x%08x]\n", hr)); return -1; } if(!m_lpIImePadServer) { Dbg(("CImePadSvrCOM::m_lpIImePadServer is NULL\n")); return -1; } m_lpCImePadCallback = new CImePadCallback(m_hwndIF, this); if(!m_lpCImePadCallback) { Dbg(("m_lpCImePadCallback is NULL\n")); return -1; } m_lpCImePadCallback->AddRef(); #if 0 hr = m_lpIImePadServer->Initialize(::GetCurrentProcessId(), ::GetCurrentThreadId(), imeLangID, dwImeInputID, m_lpCImePadCallback, &m_dwRegAdvise, 0, 0); #endif Dbg(("CImePadSvrCOM::Initialize() Initialize ret[0x%08x]\n", hr)); this->CreateIFHWND(); //Create internal Interface Window. return 0; Unref(imeLangID); Unref(lpVoid); } INT CImePadSvrCOM::Terminate(LPVOID) { Dbg(("CImePadSvrCOM::::Terminate() START \n")); HRESULT hr = S_OK; if(m_lpIImePadServer) { hr = m_lpIImePadServer->Terminate(m_dwRegAdvise, 0); if(SUCCEEDED(hr)) { m_dwRegAdvise = 0; if(m_lpCImePadCallback) { delete m_lpCImePadCallback; m_lpCImePadCallback = NULL; } hr = m_lpIImePadServer->Release(); m_lpIImePadServer = NULL; } else { DBGShowError(hr, "IImePad::Terminate"); //Dbg(("Call CoDisconnectObject()\n")); //::CoDisconnectObject((IUnknown *)m_lpIImePadServer, 0); m_lpIImePadServer = NULL; } } //---------------------------------------------------------------- //if server has downed, some times CoUninitialize() cause GPF. //First we should check what is the real problem, //And remove GPF Bug with code. //After that, for warrent, we should use _try/exception code. //---------------------------------------------------------------- Dbg(("Call Uninitialize\n")); if(m_fnCoUninitialize && m_fCoInitSuccess) { Dbg(("Call CoUninitialize()\n")); (*m_fnCoUninitialize)(); m_fCoInitSuccess = FALSE; } Dbg(("-->CoUninitialize End\n")); this->TermOleAPI(); #ifdef _RELEASEMODULE __try { if(m_fnCoUninitialize && m_fCoInitSuccess) { Dbg(("Call CoUninitialize()\n")); (*m_fnCoUninitialize)(); m_fCoInitSuccess = FALSE; } this->TermOleAPI(); } __except(EXCEPTION_EXECUTE_HANDLER) { Dbg(("########################################################\n")); Dbg(("#### CoUninitialize() CAUSE EXCEPTION!!!!!!! \n")); Dbg(("########################################################\n")); } #endif this->DestroyIFHWND(TRUE); Dbg(("CImePadSvrCOM::Terminate() End\n")); return 0; } INT CImePadSvrCOM::ShowUI(BOOL fShow) { if(m_lpIImePadServer) { m_lpIImePadServer->ShowUI(fShow); } m_fShowReqStatus = fShow; return 0; } INT CImePadSvrCOM::IsVisible(BOOL *pfVisible) { return 0; Unref(pfVisible); } INT CImePadSvrCOM::ActivateApplet(UINT activateID, DWORD dwActivateParam, LPWSTR lpwstr1, LPWSTR lpwstr2) { return 0; Unref(activateID); Unref(dwActivateParam); Unref(lpwstr1); Unref(lpwstr2); } INT CImePadSvrCOM::Notify(INT id, WPARAM wParam, LPARAM lParam) { switch(id) { case IMEPADNOTIFY_ACTIVATECONTEXT: Dbg(("CImePadSvrCOM::Notify: ActivateContext\n")); m_fLastActiveCtx = (BOOL)wParam; ::KillTimer(m_hwndIF, TIMERID_NOTIFY_ACTIVATECONTEXT); if(m_fLastActiveCtx) { ::SetTimer(m_hwndIF, TIMERID_NOTIFY_ACTIVATECONTEXT, TIMERELAPS_ACTIVATE, NULL); } else { ::SetTimer(m_hwndIF, TIMERID_NOTIFY_ACTIVATECONTEXT, TIMERELAPS_INACTIVATE, NULL); } break; case IMEPADNOTIFY_MODECHANGED: break; case IMEPADNOTIFY_STARTCOMPOSITION: break; case IMEPADNOTIFY_COMPOSITION: break; case IMEPADNOTIFY_ENDCOMPOSITION: break; case IMEPADNOTIFY_OPENCANDIDATE: break; case IMEPADNOTIFY_CLOSECANDIDATE: break; case IMEPADNOTIFY_APPLYCANDIDATE: break; case IMEPADNOTIFY_QUERYCANDIDATE: break; case IMEPADNOTIFY_APPLYCANDIDATE_EX: break; default: if(m_lpIImePadServer) { m_lpIImePadServer->Notify(id, wParam, lParam); } break; } return 0; Unref(wParam); Unref(lParam); } INT CImePadSvrCOM::GetAppletInfoList(INT *pCountApplet, LPVOID *pList) { return 0; Unref(pCountApplet); Unref(pList); } IUnknown * CImePadSvrCOM::SetIUnkIImeIPoint(IUnknown *pIUnkIImeIPoint) { return m_lpIUnkIImeIPoint = pIUnkIImeIPoint; } IUnknown * CImePadSvrCOM::SetIUnkIImeCallback(IUnknown *pIUnkIImeCallback) { return m_lpIUnkIImeCallback = pIUnkIImeCallback; } IUnknown* CImePadSvrCOM::GetIUnkIImeIPoint(VOID) { return m_lpIUnkIImeIPoint; } IUnknown* CImePadSvrCOM::GetIUnkIImeCallback(VOID) { return m_lpIUnkIImeCallback; } //---------------------------------------------------------------- // //private static method // //---------------------------------------------------------------- LRESULT CALLBACK CImePadSvrCOM::InterfaceWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPCImePadSvrCOM lpCImePadSvr = NULL; switch(uMsg) { case WM_NCCREATE: lpCImePadSvr = (LPCImePadSvrCOM)((LPCREATESTRUCT)lParam)->lpCreateParams; WinSetUserPtr(hwnd, (LPVOID)lpCImePadSvr); break; case WM_NCDESTROY: WinSetUserPtr(hwnd, (LPVOID)NULL); break; default: lpCImePadSvr = (LPCImePadSvrCOM)WinGetUserPtr(hwnd); if(lpCImePadSvr) { return lpCImePadSvr->RealWndProc(hwnd, uMsg, wParam, lParam); } break; } return ::DefWindowProc(hwnd, uMsg, wParam, lParam); } LRESULT CImePadSvrCOM::RealWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COPYDATA: return MsgCopyData(hwnd, wParam, lParam); case WM_TIMER: return MsgTimer(hwnd, wParam, lParam); case WM_USER+500: return MsgUser(hwnd, wParam, lParam); default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } LRESULT CImePadSvrCOM::MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam) { return 0; Unref(hwnd); Unref(wParam); Unref(lParam); } LRESULT CImePadSvrCOM::MsgTimer(HWND hwnd, WPARAM wParam, LPARAM lParam) { switch(wParam) { case TIMERID_NOTIFY_ACTIVATECONTEXT: ::KillTimer(hwnd, wParam); if(m_lpIImePadServer) { //try try try.. #if 0 if(!m_fLastActiveCtx) { //Inactivate case HWND hwndFG; DWORD dwTID, dwPID, dwPIDFG, dwTIDFG; hwndFG = ::GetForegroundWindow(); dwTIDFG = ::GetWindowThreadProcessId(hwndFG, &dwPIDFG); dwTID = ::GetCurrentThreadId(); dwPID = ::GetCurrentProcessId(); TCHAR szClass[256]; ::GetClassName(hwndFG, szClass, sizeof(szClass)); Dbg(("FG class [%s]\n", szClass)); if(dwTIDFG == dwTID) { return 0; } else { m_lpIImePadServer->Notify(IMEPADNOTIFY_ACTIVATECONTEXT, (WPARAM)FALSE, 0); } } #endif m_lpIImePadServer->Notify(IMEPADNOTIFY_ACTIVATECONTEXT, (WPARAM)m_fLastActiveCtx, 0); } break; default: ::KillTimer(hwnd, wParam); break; } return 0; Unref(hwnd); Unref(wParam); Unref(lParam); } LRESULT CImePadSvrCOM::MsgUser(HWND hwnd, WPARAM wParam, LPARAM lParam) { return 0; Unref(hwnd); Unref(wParam); Unref(lParam); } HWND CImePadSvrCOM::CreateIFHWND(VOID) { return NULL; #if 0 Dbg(("CImePadSvrCOM::CreateIFHWND START\n")); if(m_hwndIF && ::IsWindow(m_hwndIF)) { return m_hwndIF; } ATOM atom; HWND hwnd; #ifndef UNDER_CE // No Ex WNDCLASSEX wc; #else // UNDER_CE WNDCLASS wc; #endif // UNDER_CE #ifndef UNDER_CE // No Ex wc.cbSize = sizeof(wc); #endif // UNDER_CE wc.style = 0; wc.lpfnWndProc = (WNDPROC)CImePadSvrCOM::InterfaceWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = m_ghModClient; wc.hIcon = (HICON)NULL; wc.hCursor = (HCURSOR)NULL; wc.hbrBackground = (HBRUSH)NULL; wc.lpszMenuName = NULL; wc.lpszClassName = SZ_IMEPADCLIENTCLASS; #ifndef UNDER_CE // No Ex wc.hIconSm = NULL; atom = ::RegisterClassEx(&wc); #else // UNDER_CE atom = ::RegisterClass(&wc); #endif // UNDER_CE hwnd = ::CreateWindowEx(0, SZ_IMEPADCLIENTCLASS, NULL, WS_POPUP | WS_DISABLED, 0,0,0,0, NULL, NULL, m_ghModClient, (LPVOID)this); if(!hwnd) { Dbg(("CreateWindowEx Error %d\n", GetLastError())); } m_hwndIF = hwnd; Dbg(("CImePadSvrCOM::CreateIFHWND END\n")); return hwnd; #endif } BOOL CImePadSvrCOM::DestroyIFHWND(BOOL fReserved) { Dbg(("CImePadSvrCOM::DestroyIFHWND() START\n")); #if 0 if(m_hwndIF && ::IsWindow(m_hwndIF)) { ::DestroyWindow(m_hwndIF); m_hwndIF = NULL; } //Must Unregister class. BOOL fRet = ::UnregisterClass(SZ_IMEPADCLIENTCLASS, m_ghModClient); if(!fRet) { Dbg(("UnregisterClass Failed [%d]\n", GetLastError())); } Dbg(("CImePadSvrCOM::DestroyIFHWND() END\n")); #endif return TRUE; Unref(fReserved); }