From 4cb488964d9ec6d9a74cf06cab1f2f2105f4a8ae Mon Sep 17 00:00:00 2001 From: kichik Date: Mon, 26 May 2003 17:05:13 +0000 Subject: [PATCH] Threads safer git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2574 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/BgImage/BgImage.cpp | 123 ++++++++++++++++++++++++------------ Plugins/BgImage.dll | Bin 7168 -> 7168 bytes 2 files changed, 81 insertions(+), 42 deletions(-) diff --git a/Contrib/BgImage/BgImage.cpp b/Contrib/BgImage/BgImage.cpp index c230c1a1..ad2a4141 100644 --- a/Contrib/BgImage/BgImage.cpp +++ b/Contrib/BgImage/BgImage.cpp @@ -2,6 +2,12 @@ #include #include "../exdll/exdll.h" +#undef EXDLL_INIT + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; } + #define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) char szTemp[2048]; @@ -9,6 +15,16 @@ HWND hWndImage, hWndParent; HINSTANCE g_hInstance; +CRITICAL_SECTION CriticalSection; + +void ECS() { + EnterCriticalSection(&CriticalSection); +} + +void LCS() { + LeaveCriticalSection(&CriticalSection); +} + enum { MIL_DUMMY, MIL_GRADIENT, @@ -43,6 +59,7 @@ void *oldProc; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int myatoi(char *s); COLORREF GetColor(); +void GetXY(LPPOINT lpPoint); BOOL bReturn; @@ -66,7 +83,7 @@ static void my_pushstring(char *str) NSISFunc(SetBg) { EXDLL_INIT(); - bgBitmap.bReady = FALSE; + ECS(); if (!hWndImage) { hWndParent = hwndParent; @@ -90,14 +107,15 @@ NSISFunc(SetBg) { "NSISBGImage", 0 }; - if (!RegisterClassEx(&wc)) { - my_pushstring("can't register class"); + ATOM atomClass = RegisterClassEx(&wc); + if (!atomClass) { + my_pushstring("can't create window"); return; } hWndImage = CreateWindowEx( WS_EX_TOOLWINDOW, - "NSISBGImage", + (LPSTR)atomClass, 0, WS_CLIPSIBLINGS|WS_POPUP, 0, @@ -159,7 +177,7 @@ NSISFunc(SetBg) { } if (!GetObject(bgBitmap.hBitmap, sizeof(bBitmap), (void *)&bBitmap)) { - my_pushstring("can't query bitmap size"); + my_pushstring("can't load bitmap"); return; } if (!bgBitmap.rPos.right) { @@ -175,6 +193,8 @@ done: bgBitmap.bReady = TRUE; + LCS(); + if (hWndImage) { SetWindowPos( hWndImage, @@ -191,6 +211,8 @@ done: } NSISFunc(AddImage) { + ECS(); + myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList)); if (!newImg) { my_pushstring("memory allocation error"); @@ -213,34 +235,29 @@ NSISFunc(AddImage) { return; } - popstring(szTemp); - int iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndWidth; - newImg->rPos.left = newImg->rPos.right = (unsigned int)iPosTemp; - popstring(szTemp); - iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndHeight; - newImg->rPos.top = newImg->rPos.bottom = (unsigned int)iPosTemp; + GetXY(LPPOINT(&newImg->rPos)); BITMAP bBitmap; if (!GetObject(newImg->hBitmap, sizeof(bBitmap), (void *)&bBitmap)) { - my_pushstring("can't query bitmap size"); + my_pushstring("can't load bitmap"); return; } - newImg->rPos.right += bBitmap.bmWidth; - newImg->rPos.bottom += bBitmap.bmHeight; - - newImg->bReady = TRUE; + newImg->rPos.right = newImg->rPos.left + bBitmap.bmWidth; + newImg->rPos.bottom = newImg->rPos.top + bBitmap.bmHeight; myImageList *img = &bgBitmap; while (img->next) img = img->next; img->next = newImg; my_pushstring("success"); + + LCS(); } NSISFunc(AddText) { + ECS(); + myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList)); if (!newImg) { my_pushstring("memory allocation error"); @@ -260,30 +277,17 @@ NSISFunc(AddText) { popstring(szTemp); newImg->hFont = (HFONT)myatoi(szTemp); newImg->cTextColor = GetColor(); - popstring(szTemp); - int iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndWidth; - newImg->rPos.left = (unsigned int)iPosTemp; - popstring(szTemp); - iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndHeight; - newImg->rPos.top = (unsigned int)iPosTemp; - popstring(szTemp); - iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndWidth; - newImg->rPos.right = (unsigned int)iPosTemp; - popstring(szTemp); - iPosTemp = myatoi(szTemp); - if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndHeight; - newImg->rPos.bottom = (unsigned int)iPosTemp; - - newImg->bReady = TRUE; + + GetXY(LPPOINT(&newImg->rPos)); + GetXY(LPPOINT(&newImg->rPos) + 1); myImageList *img = &bgBitmap; while (img->next) img = img->next; img->next = newImg; my_pushstring("success"); + + LCS(); } NSISFunc(Redraw) { @@ -292,7 +296,9 @@ NSISFunc(Redraw) { } NSISFunc(Clear) { - bgBitmap.bReady = FALSE; + ECS(); + + BOOL bIsFirst = TRUE; myImageList *img = &bgBitmap; while (img) { @@ -306,12 +312,20 @@ NSISFunc(Clear) { break; } + myImageList *thisImg = img; + img = img->next; - if (img) GlobalFree(img); + if (!bIsFirst) + GlobalFree(thisImg); + else + bIsFirst = FALSE; } bgBitmap.next = 0; + bgBitmap.bReady = FALSE; + + LCS(); } NSISFunc(Destroy) { @@ -324,11 +338,13 @@ NSISFunc(Destroy) { NSISFunc(Sound) { char szLoop[] = {'/', 'L', 'O', 'O', 'P', 0}; + char szWait[] = {'/', 'W', 'A', 'I', 'T', 0}; + char szStop[] = {'/', 'S', 'T', 'O', 'P', 0}; DWORD flags = SND_FILENAME | SND_NODEFAULT; g_stacktop=stacktop; popstring(szTemp); - if (lstrcmpi(szTemp, "/WAIT")) + if (lstrcmpi(szTemp, szWait)) flags |= SND_ASYNC; else popstring(szTemp); @@ -336,7 +352,7 @@ NSISFunc(Sound) { flags |= SND_LOOP; popstring(szTemp); } - PlaySound(lstrcmpi(szTemp, "/STOP") ? szTemp : 0, 0, flags); + PlaySound(lstrcmpi(szTemp, szStop) ? szTemp : 0, 0, flags); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -358,6 +374,8 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_PAINT: if (bgBitmap.bReady) { + ECS(); + PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); @@ -398,7 +416,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) myImageList *img = bgBitmap.next; while (img) { - if (!img->bReady) break; if (img->iType == MIL_TEXT) { SetBkMode(hdc, TRANSPARENT); @@ -511,6 +528,8 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) img = img->next; } + LCS(); + EndPaint(hwnd, &ps); } break; @@ -522,7 +541,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; } case WM_CLOSE: - DestroyWindow(hWndImage); + DestroyWindow(hwnd); break; default: return DefWindowProc(hwnd, message, wParam, lParam); @@ -541,6 +560,18 @@ COLORREF GetColor() { return RGB(iRed, iGreen, iBlue); } +void GetXY(LPPOINT lpPoint) { + popstring(szTemp); + int iPosTemp = myatoi(szTemp); + if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndWidth; + lpPoint->x = (unsigned int)iPosTemp; + + popstring(szTemp); + iPosTemp = myatoi(szTemp); + if (iPosTemp < 0) iPosTemp = iPosTemp + (int)uWndHeight; + lpPoint->y = (unsigned int)iPosTemp; +} + int myatoi(char *s) { unsigned int v=0; @@ -588,5 +619,13 @@ int myatoi(char *s) BOOL WINAPI _DllMainCRTStartup(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: + InitializeCriticalSection(&CriticalSection); + break; + case DLL_PROCESS_DETACH: + DeleteCriticalSection(&CriticalSection); + break; + } return TRUE; } \ No newline at end of file diff --git a/Plugins/BgImage.dll b/Plugins/BgImage.dll index 2d371b0e3b9d9d2e38fd3011b876d65e9e67f3b0..3afaf519a06e52da3aaf1316393d75f53c725acd 100644 GIT binary patch delta 3704 zcmdT{jdN7h6~DXrL^fuHeYyg%i3teBfwyn>?FXBr0eK-R=tAgQQZazAvg}}tabHFS z-Ly+OygZ}Cg{rirgg7H()p44Z;^@HgwGqV(UnA*YEw&L~Oe|q0@@4Gp@4nsGwEhKs zGrzs(o^$Rw_nv#sd2d_1E#7T$(bRMJ!)5=$N6Q8=U-;q6%X%>;KL2)E3ZwV$y~em~ z!`d*@?I^K#oXpRr%ZR5b|yZq-j?vn}vV6H~7(!6C1ARQPc4hmB zRo17#P)~Ll0Y|3XN+@6Lo0_bz>KcLakxoOYH5r|y@vT>)rR~+(0U9l{P;NOiwE`yA za%I&-xfNg}8nbON!;55-gN6tFXOvRs6`yzw_6l3yfjjNteE(-^Q9jlxH-%Tj^MJ)n zNasmV2PuVj(b+N;ncc!aCuQRa!`2o#5N^Rpx!0iPPj#`qVJlT^E59%i z5{!)2Qf@DVT?D&qsn`pNS+P*@O%RkLkjR?&CI{+B+d zRxpQZ5pyT&)v#GNct^OHkBze${W3nCImWh_XA-eek?B*Bt&I>lf*3r7Q?w=x&(T}j zm*`6)_5kI)23N@oTcA1E6gRvPO&Zpg3@H=U0%o9#*@_!SBaFvfb;X#co}3Txi%1eZ z@*Slb$0FQ%Iy$41Ni{=rc3;Fg`+DHi;L_Stmx5Ge`LK*~Q8*4~Lrc%a^14;^4;?=e zuV9Hrq6^{`EGjwka2kt)h9W)~qEi8mZ$`Dx@S7XaJHV2!A`2BGrxM}Dde z#fR*2P(L*DzmIT%5n+8Q%A{`4 zr{%rN5++L;Qmd_6wIxd$R;z8DC)loXv=6lTWpI7fh>!Y2nf?X4c6|bzuc|+Oq!x#| z9QzjWE@BZe&US{KD_UwCCY75V)Jxb-af}*hRI%utX-#62N}+LdeLJ&=pdSe$30RQ_ z^-HiA)DPsL2&<>*vy9Q+UY#G%*Mn}awg&Wi5b>kd{n+~|TyJK(hqRiq*5hN_Z7kEh z8RG+WFc~%>KM*iNjov`H?QGBaW3yKFi3EwDXEAvqE4gNxA1?mo)~}nClI= z1{@^aG{Vbai*nnbl1ZCsnq+GUU5=5K&~;#d$VQ2|pu+tw;rA4aZ>1Y~*+ z-FE_1vY;}Uhf0S+46>oLOqm#8GMX>zJlJ(q8Eu#PBZP@q8!t`a68FOv%MK&&8)Z$& z_ZzjQ)Wx5*<))AE>6rBty|#Yz=RCd`y; z#Ik{}veDutOI$CER@Ox4#&vg;8>h-`WJ<>jC0o44j&xy_uhwJ_ybUHg;%26>2XwrG zT_!2qvICRap#I%8O53Gv0Xasw7AR%3utJe=*FssrigonqtwlVH-=cqTa!ZLeOnQ_*UK)ZA@fE%FPJBb~ZnJbyw&AT+C z6bAb7Qf8B% zmBLmVUK@JbNczI5l25s<5UzU2nXEs4*h-MhOKa1`C+n|6P1c(ceOc?%Uo~dzJuf4S zh7DP-OH8!hzF@3c^)-eL`@E=YP1Ze|n`K<5wzP|vd1IvMGU>-0BC}%{#yz@c#h3P>K(!7BIrV zN?BXr?aYxCm|Nk+0kw^{EP}4n48=@Q5uGv@{S{vQ)cmpAe%!@;7nnOR}@5|cw zWVC7RV~rc;lW$Ck(~~Qm&yaw7QR zCnbJtUy#^h4|F$~A2!9Xa67!2_&mOVpUmIE-^Jg}`}ivUetsz*;T!o)e1iWi{|5ga zf0#ePpW<)uH#=@~lsYOMl4G&sA;)URqmIWNies~*&C%g_*|FR4y5lX!yN;xz*U{(r z%rW2?cHD3f;bwsoek9Bg<_e-vB`gwTVU@66h&2nFgr5s-!i&NV;WgncpJMGRQ=M3k3=VE8jx!&2}+~NF_^MLbX=jYDL&Rbk}x|}Y_6?AQNz2MsA zI^a6$I^jC)`rI|($`eb(yF|BGDJ~QPqAac!8^kBYr^R217sNr)?Y_^w&K-%lpL1_< zx4Cz^ce{_d&$%zUFS~E@SUtCSiafJCb3H%t+~=wHtn)nSdD^qZ)8=`_v&Xa7bI^0r zbIFtAz1>^w4SHAOFXC43F7F%OyhhD%dvBE-9^p54eX~H+F@WNHL%YBjhaABg!Cs2otr{ZxE`Zs-wtWG zL>?n=&YcaECe*x^)DPY#;tKb=97EQQ{iDoC@C~=_~LrD81Vo-XtPxQ3Q zqFL%n*QMqBTacCW`{{qK3u;Et!P0Qthgd&Im+PiVVGP z!P#)Zf5?wTGMC7?)IuvYAgOMsU3_JH*f&%z`h}cNEz9}Tbi}F&R9F+}zK|5s?BP@f zs9j{hg`sydtR+h_#)en>^#~NPPbs+?8zE=?V9l>9rKBIiQnF|kyVL1$BZVYzJbJ%k zr&i&qB2c-hha%RgXC9MIswb}mOErO3!a~jdWb$~1Jx)uFMCT;(X?bK=nekKMbl~!U~Zy^oh(=q>9rag(6c1cPf1iHxS(c8r>QAmUz^m z{heNtP*;Xg{j4A75jVNsq&Z355gf>P*jbPv6hW5pE8ENS>a_F$ig=TfN&YeGmOA{m)+T?hlrBPIa5r?+U zq}hGC^4PGj1wLJ26!GdlT2h8WB(u*@XzMO?(j2!~u=`57azuH^1($EiYg}Oy1Jz0-EWM5K|G2Nlz9nJSmv! z29nwaX-VBS47ajqygD1BBo{f zso6In84>f~Y717KiF;|ujv!J<$)`>3pqjjF&Wo>ep&_PA+NW1ON!&}Vk;;lrNfT&0 zKzq=OH`O8d8Z`verILOo zA*oBeHKR+sJ-;h1ez%}YyaV(H_Zx|k=-pKv^PQ$C`LvCrgPevoIEeP0HuuUfNxgj= zVK<7mf;uslDJ9-Bs~0J;G(y6sQqr{jPwK*%z78do73D`$_oYTsV&;GzRcvvh&XO$6 z99fczh-L|tqS!dTJu*6oXCV54h@S*si`ldo{w)I;((F%w+WWPMc701i&5q7ZzLjZ< z|AbPH=~P>y*nw9JZ31$!skaTp!5r?SQm=rJ(BB>;d(-n+ls1anLWs@266}GFtmHee zP;$rPUluK~rxBPF^HiUfMO#q&G*NAZB6A*mf7}^O;Of;P3QTRe>r$%{8{cbqfI;w`WZZ1S5CwlPL31rgCU z$n0xz`I9-8siUUoQC|->iYJ1|y=JdTF0xF~{e9+TMW9vN`xRcXiH%O=@G53oGiI4$ zfrvquo<M_J=aRSe$}rp$6(1H9i2Gr*s5+V>95G%)7f#}Jffrg zXwqeUeK`Fh;M)rhS=!bZry1fklL)B?o&%bJH-N*yOcx;xFb=o}_ztwMfHS};U@1VK z8xsk+44eT@0H!?b$4H-XkeLQd0Bt(Z5A*>Sfga#U9=>~aWAZAn1K0vYfu%qYm<41G z7HXVBqjsYXyusXJ2{W@?2aE~TrwvCWVJ0Y(D0bqj_g1|M*FGA)^ z;9KAhkcNuN1gyX~T3yg=Bx%G%(n$sxM&>M^x2kG+b+U47OS0Zr|7*vnk!xbrwHusE zS43A;)i~F#_(gScgk#>=WmP|$9Cg-KFJG}XT3zd0wz6vNT4+m_Iu>TlC@otM#9~J1 zp?PJfMW-PScbXAH29wP=m|W(5hGk|kbC`0bido5QVxD7OU|wckWp*?BnRl6E%r)jN zGm_0=C$kT-g=`61!7gK0u(j-Zb|d>NyMuj+ZDs$+{+az7+rb`ZKV#3bm)URFyKEXa zl5=o*+!T)CJlum^Ay>jxa$zoB!)@deoXjb-|kNbc-#eK$I=B{yfI5U3_ zKY^dbPvhtCC44#mQ@)mek^cjKh(E`F%irbA?p!zHe#l+su6F<2y~(}XecXN7oi5mg zal!*ap)g-46P5^7LPS_CGzz~L-Vojv_6moEW5Oxng78IL_);)>@;ncC+@7VLTF+)r zi{~}Zeou#|+w-aCA0DIE=FRg?@$%jxZ;7|eyTtpHccu3k?`H4sye-~c-aXz9Z@2ej z?^*99Z@)LoH_bQ4C;1Y-?Y@_M@A%&JUGjb7v-