[置頂]

書單: 安迪葛洛夫:Only paranoid survives.

Feb 27, 2009

[share] Don't put an expression in a macro !!!

Dear all,

I made a mistake...

I wrote code like following...

FAILED_RETURN(hr = CopyPEFiles(bCopyPEFiles));       

The definition of FAILED_RETURN is

#define FAILED_RETURN(hr)       { if(FAILED(hr)) { _ASSERT(FALSE); return hr; } }



Guess what?

The macro is expended like:

{if(FAILED(hr = HPCopyPEFiles(bCopyPEFiles)) {_ASSERT(FALSE); return hr = HPCopyPEFiles(bCopyPEFiles);}



Oops! CopyPEFiles() are entered twice !!!!


The correct code should be:

hr = CopyPEFiles(bCopyPEFiles);
FAILED_RETURN(hr);


Putting an expression in parameter list of a function may be safe,

but it MUST BE dangerous in a macro !!!



Feb 13, 2009

今年大製作動作片預告

魔鬼終結者4: 未來救贖
http://www.truemovie.com/2009moviedata/TerminatorSalvation.htm
* 看上去非常有質感,預期會是一部好片
北美上映日期:2009/05/22
台灣上映日期:2009/05/27

(為什麼官網 (http://rss.warnerbros.com/terminatorsalvation/) 的海報是 05.09 啊?
是延後上映嗎?)

變形金剛2
http://www.truemovie.com/2009moviedata/Transformers2.htm
* 現在只有超級盃預告,不過光是開場的隕石撞擊空母,就讓我覺得「對,就是要這樣」的期待了,有那種麥克貝+布拉克海默的feel
北美上映日期:2009/06/26
台灣上映日期:2009/06/26

(比T4晚一個月...)


 

Feb 11, 2009

[Batch Script Programming] Execute 2 commands in IF expression

You can execute 2 or more commands in one IF expression:

  • You can use "&" to execute 2 or more command if a IF expression
  • @echo off

    set A=12
    set B=24

    IF %A% EQU 12           echo "hawaii" & echo "los angles" & echo "tapiei"

    The result is
    "hawaii"
    "los angles"
    "tapiei"

  • If you use set command right before "&", don't leave space. Or the space will become part of the value.

  • For example, following code will search \sources\boot.wim in each drive (from C to Z). If found, it will set variable RP the drive.

      FOR %%d in (C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) DO IF EXIST %%d:\sources\boot.wim set RP=%%d& GOTO END_SEARCH_RP

      However, if you leave space befire "&", like this:

      FOR %%d in (C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) DO IF EXIST %%d:\sources\boot.wim set RP=%%d & GOTO END_SEARCH_RP

      If "E" is the drive, the above code will set RP as "E ".

Feb 6, 2009

search by regex in VS 2005

If you want to use regular expression to search string, please refer

http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx


Some regex items cannot be used in VS 2005,

ex: \W, \A, \S....


Feb 1, 2009

About PostQuitMessage(0)

http://www.hkitn.com/article.php/2552/2
這裏我們主要使用了三種消息:WM_PAINT , WM_COMMAND和WM_DESTROY ,但是我們可以隨著程式而是用各種各樣的消息。為了處理不同的消息,在程式中使用了分支結構,所以隨著程式的規模越來越大,這個分支結構也會越來越龐大。

  在這些消息中有兩個點是最為重要的,其一是WM_DESTROY消息,它表示一個銷毀視窗退出應用程式的消息。也是每個程式所必備的。對於這個消息的處理方式就是通過調用PostQuitMessage ( 0 )函數傳遞一個WM_QUIT消息,準備讓由GetMessage 、 TranslateMessage和DispatchMessage三個函數組成的消息迴圈中的GetMessage取得。當消息迴圈中的收到WM_QUIT消息時,GetMessage會傳回0,從而結束消息迴圈。進而釋放各種資源,結束整個程式。另一個重要的地方是DefWindowProc函數。我們的程式無論多大都不可能將所有的消息都處理,所以我們必須有一個機制讓不重要的不需要我們處理的消息,交給windows作業系統為我們處理,這個過程就是由DefWindowProc函數來實現的。 因此當我們按下視窗右上角的差號或者按下左上角系統功能表中的Close命令時,系統會送出WM_CLOSE消息。通常程式的視窗函數不攔截此消息,於是交由DefWindowProc函數來處理。DefWindowProc函數在受到WM_CLOSE消息後,調用DestroyWindow把視窗清除。DestroyWindow又會送出WM_DESTROY消息。程式又如前面講到的一樣來結束程式釋放資源。


其他參考:
http://msdn.microsoft.com/zh-tw/library/dd229215.aspx
大內高手專欄:
揭開訊息迴圈的神秘面紗
作者:蔡學鏞
2005 年 3 月

http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=95232