Force RichEdit COM calls to UI thread

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7307 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2021-08-26 17:09:42 +00:00
parent ddf9e907a3
commit fc5f7c8ad4
3 changed files with 17 additions and 3 deletions

View file

@ -621,6 +621,17 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script);
break;
}
case WM_MAKENSIS_FREEZEEDITOR:
{
ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc;
if (pTD) {
if (lParam)
return pTD->Freeze(0);
else
pTD->Unfreeze(0);
}
break;
}
case WM_TIMER:
{
HWND hCtl;

View file

@ -96,6 +96,7 @@ static inline bool IsWin95() { return SupportsW95() && (GetVersion() & (0x8000FF
#define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002)
#define WM_MAKENSIS_SAVESYMBOLSET (WM_USER+1003)
#define WM_MAKENSIS_UPDATEUISTATE (WM_USER+1004)
#define WM_MAKENSIS_FREEZEEDITOR (WM_USER+1005)
#define TID_CONFIGURECLOSEORABORT 1
namespace MakensisAPI {

View file

@ -233,14 +233,16 @@ void ReleaseLogWindow() {
#endif
}
void InitializeLogWindow() {
HWND hRE = GetDlgItem(g_sdata.hwnd, IDC_LOGWIN);
#ifdef RE_HAS_TOM
IUnknown *pTD = 0, *pREO;
if (SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) {
if (SendMessage(hRE, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) {
if (FAILED(pREO->QueryInterface(IID_ITextDocument, (void**) &pTD))) pTD = 0;
pREO->Release();
}
g_sdata.pLogTextDoc = pTD;
#endif
SendMessage(hRE, EM_SETTEXTMODE, TM_PLAINTEXT, 0);
}
void SetLogColor(enum LOGCOLOR lc)
@ -268,13 +270,13 @@ void LogMessage(HWND hwnd,const TCHAR *str) {
HWND hLogWin = GetDlgItem(hwnd, IDC_LOGWIN);
#ifdef RE_HAS_TOM
ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc;
if (pTD) pTD->Freeze(0);
HRESULT hr = (HRESULT) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, true); // Force COM calls to UI thread
#endif
SendMessage(hLogWin, EM_SETSEL, g_sdata.logLength, g_sdata.logLength);
SendMessage(hLogWin, EM_REPLACESEL, 0, (LPARAM)str);
SendMessage(hLogWin, EM_SCROLLCARET, 0, 0);
#ifdef RE_HAS_TOM
if (pTD) pTD->Unfreeze(0), InvalidateRect(hLogWin, NULL, false);
if (SUCCEEDED(hr)) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, false);
#endif
g_sdata.logLength += lstrlen(str);
}