Sean's Note: 12月 2011

2011年12月16日 星期五

[Debug] printf


撰寫程式時,我們常會透過 printf 來 debug,但 release 的時候又

需要把這些 printf 註解掉,造成了不少麻煩。這時我們可以利用

Maco 定義我們的 printf 函數,當有定義 _DEBUG_ 時才印出東西,

否則不作任何事,_DEBUG_  就像一個開關一樣。

範例如下:

#define _DEBUG_

#ifdef _DEBUG_
  #define DPRINTF(...) { printf(__VA_ARGS__); }
#else
  #define DPRINTF(...)
#endif

DPRINTF ("123\n");
DPRINTF ("%d\n", 123);

WM_SIZE & WM_WINDOWPOSCHANGED

當我們建立很多視窗和子視窗時,常會利用 WM_SIZE 來改變子視窗的位移狀態,

但有時候會發現子視窗並無收到 WM_SIZE 的訊息,導致程式執行的結果不如預期

在 MSNDN 論壇上看到,有人建議在處裡父視窗時用 WM_SIZE,處理子視窗時用

WM_WINDOWPOSCHANGED。

那也許都用 WM_WINDOWPOSCHANGED 也可以 ?

PS: 視窗大小改變的觸發順序:

WM_WINDOWPOSCHANGING -> WM_WINDOWPOSCHANGED -> WM_SIZE

資料參考 :
1. http://social.msdn.microsoft.com/forums/en-US/windowsuidevelopment/thread/25181bd5-394d-4b94-a6ef-06e3e4287527/

2. http://blogs.msdn.com/b/alejacma/archive/2008/11/20/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows-exceeds-a-certain-depth-x64.aspx

2011年12月14日 星期三

Inside COM - 讀後筆記


COM (Component Object Model)

Benefits:
1. Application Customization, each component can be replaced with a different component that better meets the needs of the user.
2. Component Libraries, choose components from a components library like Lego building blocks to form applications.
3. Distributed Components, the application has been divided into functional parts that can be located remotely.

Requirements:
1. dynamic linking
2. information hiding(Encapsulate), the more the interface is isolated from implementation details, the less likely the
   interface will change as a result of changing the client or the component.

 
COM doesn't compete with or replace DLLs. COM uses DLLs to provide components with the ability to dynamically link.

For COM, an interface is a specific memory structure containing an array of function pointers.

A class is not a component. You can implement a single COM component using several C++ classes or C structures.

The COM client doesn't know the interface supported by a component. To find out whether the component supports a
particular interface, the client asks the component for that interface at run time.

In QueryInterface, you can't use a case statement because the interface identifier is a structure and not a number.

IID is type defined as a 128-bit(16-byte) structure called a GUID(Globally Unique Identifier).
In COM, a GUID used to identified a components is called a class identifier(CLSID).

2011年12月12日 星期一

WinDbg

微軟提供的 WinDbg 提供了許多除錯的功能,常用的例子如:

當我們想 Trace 哪些程式使用了 Windows 的 SetCursor API,

我們可以先打 x USER32!*setcursor

x:              查詢 symbol name 的指令
user32:     欲查詢的 Module name
!:               分隔符號
*:              萬用字元
setcursor: 欲查詢的 API

搜尋結果:

777ff34b USER32!ReaderSetCursor = <no type information>
777b3075 USER32!NtUserSetCursor = <no type information>

再設定中斷點:
bp USER32!NtUserSetCursor "k; g"

即可攔截該 API 。


2011年12月6日 星期二

[Android] 環境架設

按此跳轉自[Android] 環境架設 (2014 更新版)

1. 安裝 Android SDK。(http://developer.android.com/sdk/index.html)

2. 先裝好 Eclipse (目前的版號是 3.7 Indigo) 。

3. 到 Help -> Install New Software... ,

    就會彈出下載視窗,點選 Add ,在欄位裡輸入,

    Name:Android (可自訂名稱)
    Locationhttps://dl-ssl.google.com/android/eclipse/ (伺服器位置)

   即可下載 Android Developer Tools 套件,

   在這裡可能會遇到 missing “org.eclipse.wst.sse.core 0.0.0″ 的錯誤訊息,

    此時,一樣先下載 Eclipse 的 Mobile Application Development 套件

    NameIndigo
    Locationhttp://download.eclipse.org/releases/indigo/

   在安裝一次 Android Developer Tools 即可。

4. Restart Eclipse.

5. 開啟後,Android SDK Manager 會自動跳出協助下載 Android SDK。
   
   另外,也可以到 Android Developers 自行下載。

6. 到 "我的電腦" 設定環境變數,在 Path 後加上 SDK 的安裝路徑,

    如: C:\Program Files\Android\android-sdk

7. 即可開始建立第一支 Android Project 啦!


Note: Android SDK Tools 常會有更新,目前是 Rev.21 (2012.11.14),

在更新到 Rev.20 時,可能會發現某資料夾正在被使用或被防毒軟體擋下,

以至於檔案無法移動的錯誤訊息。這時,只能靠手動的方式進行,移動雖然失敗,

但更新檔已在: C:\Program Files\Android\android-sdk\temp\tools_r20-windows.zip,

只要將其解壓縮覆蓋到 C:\Program Files\Android\android-sdk\tools 即可。



2011年12月5日 星期一

工作管理員會拿走滑鼠資源

發現一個有趣的問題,當在執行自己開發的 A 程式時,

同時開著工作管理員,工作管理員會因為要一直更新,

而不斷的使用滑鼠資源,造成 A 程式一直收到 WM_MOUSEMOVE, 

所以造成 A 程式可能會有些不預期的狀況發生。