mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
[MSCTF] Implement TF_RunInputCPL (#6231)
- Add FullPathExec, and RunCPLSetting helper functions. - Implement TF_RunInputCPL function by using them. - Modify msctf.spec. CORE-19361
This commit is contained in:
parent
bfa3e554d4
commit
69a925cae8
2 changed files with 76 additions and 1 deletions
|
@ -32,7 +32,7 @@
|
|||
@ stub TF_IsCtfmonRunning
|
||||
@ stub TF_IsInMarshaling
|
||||
@ stub TF_MlngInfoCount
|
||||
@ stub TF_RunInputCPL
|
||||
@ stdcall TF_RunInputCPL()
|
||||
@ stdcall -stub TF_PostAllThreadMsg(long long)
|
||||
@ stdcall TF_RegisterLangBarAddIn(ptr wstr long)
|
||||
@ stdcall TF_UnregisterLangBarAddIn(ptr long)
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
|
||||
|
||||
DWORD g_dwOSInfo = 0; // See cicGetOSInfo
|
||||
|
||||
BOOL StringFromGUID2A(REFGUID rguid, LPSTR pszGUID, INT cchGUID)
|
||||
{
|
||||
pszGUID[0] = ANSI_NULL;
|
||||
|
@ -42,10 +44,53 @@ BOOL StringFromGUID2A(REFGUID rguid, LPSTR pszGUID, INT cchGUID)
|
|||
|
||||
#ifdef UNICODE
|
||||
#define StringFromGUID2T StringFromGUID2
|
||||
#define debugstr_t debugstr_w
|
||||
#else
|
||||
#define StringFromGUID2T StringFromGUID2A
|
||||
#define debugstr_t debugstr_a
|
||||
#endif
|
||||
|
||||
BOOL FullPathExec(LPCTSTR pszExeFile, LPCTSTR pszCmdLine, UINT nCmdShow, BOOL bSysWinDir)
|
||||
{
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
CicSystemModulePath ModPath;
|
||||
TCHAR szCommandLine[2 * MAX_PATH];
|
||||
|
||||
ModPath.Init(pszExeFile, bSysWinDir);
|
||||
if (!ModPath.m_cchPath)
|
||||
{
|
||||
ERR("%s\n", debugstr_t(pszExeFile));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
StringCchCopy(szCommandLine, _countof(szCommandLine), pszCmdLine);
|
||||
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
si.wShowWindow = nCmdShow;
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
if (!CreateProcess(ModPath.m_szPath, szCommandLine, NULL, NULL, FALSE,
|
||||
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
|
||||
{
|
||||
ERR("%s, %s\n", debugstr_t(ModPath.m_szPath), debugstr_t(szCommandLine));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline BOOL
|
||||
RunCPLSetting(LPCTSTR pszCmdLine)
|
||||
{
|
||||
if (!pszCmdLine)
|
||||
return FALSE;
|
||||
|
||||
return FullPathExec(TEXT("rundll32.exe"), pszCmdLine, SW_SHOWMINNOACTIVE, FALSE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* TF_RegisterLangBarAddIn (MSCTF.@)
|
||||
*
|
||||
|
@ -118,3 +163,33 @@ TF_UnregisterLangBarAddIn(
|
|||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* TF_RunInputCPL (MSCTF.@)
|
||||
*
|
||||
* @implemented
|
||||
*/
|
||||
EXTERN_C HRESULT WINAPI
|
||||
TF_RunInputCPL(VOID)
|
||||
{
|
||||
CicSystemModulePath ModPath;
|
||||
TCHAR szCmdLine[2 * MAX_PATH];
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
// NOTE: We don't support Win95/98/Me
|
||||
if (g_dwOSInfo & CIC_OSINFO_XPPLUS)
|
||||
ModPath.Init(TEXT("input.dll"), FALSE);
|
||||
else
|
||||
ModPath.Init(TEXT("input.cpl"), FALSE);
|
||||
|
||||
if (!ModPath.m_cchPath)
|
||||
return E_FAIL;
|
||||
|
||||
StringCchPrintf(szCmdLine, _countof(szCmdLine),
|
||||
TEXT("rundll32.exe shell32.dll,Control_RunDLL %s"), ModPath.m_szPath);
|
||||
if (!RunCPLSetting(szCmdLine))
|
||||
return E_FAIL;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue