2010-07-21 74 views
1

我正在C#中轉換一個C++應用程序,並設法通過大部分工作。但是我堅持用下面的語句:C++這個簡單的宏是幹什麼的?

#define GET_SHCALL_ID(L)       (((L) >> 24) & 0x000000FF) 

它由接收窗口消息,並通過在lParam的這個調用應用程序的其他部分調用,如下圖所示:

// We perform and event handling to display state as required here.. 
LRESULT CShockSampleDlg::OnShockCallEvent(WPARAM wParam, LPARAM lParam) 
{ 
    // Pass events here so that they will be displayed int the m_LogMessages window. 
    OnDebugCallEvents(wParam, lParam); 

    UINT callID = GET_SHCALL_ID(lParam); 
    UINT chanID = GET_SHCHAN_ID(lParam); 
    UINT info = GET_SHCHAN_INFO(lParam); 

所以我的問題是:

  • 什麼是宏/方法在做什麼?
  • C#中的等價物是什麼?

回答

5

考慮一個32位的整數組成的4個八位字節(字節):

zzyyxxww 
0x12345678 

即操作提取 「ZZ」(0×12)字節。

但這只是實施。用法顯然是寫在名字GET_SHCALL_ID - 它得到 S中SH玉珠呼叫IDlParam

C#和C++共享許多操作符,在這種情況下,函數是一樣的。

uint GET_SHCALL_ID(uint lParam) { return (lParam >> 24) & 0xFF; } 
+2

那裏是什麼&'0x000000FF'部分?似乎是(L)>> 24'就足以提取'zz'字節。 – 2010-07-21 10:44:49

+0

+1解釋和給出代碼片段.. – Favonius 2010-07-21 10:49:58

+2

@zilgo:(1)有可能'LPARAM'是一個64位整數而不是32位。 (2)有可能'LPARAM'被簽名而不是無符號。 – kennytm 2010-07-21 10:50:22

1

它需要一個32位的值的最顯著8個比特,從而0x12345678,例如,變得0x12

通常,lParam將攜帶幾位信息,這是其中一個。看起來這是衝擊呼叫標識符,而其他兩個宏將出於其他目的(通道ID和通道信息)從lParam中獲得不同的位。

C#會是這樣的:

uint lParam = 0x12345678;   // for testing. 
uint callID = (lParam >> 24) & 0xff; 
uint chanID = ...;     // These depend on where the 
uint info = ...;     // other bits are in lParam. 

從技術上講,不需要& 0xff對於這種情況,而是將是如果lParam恰好是一個符號int(因爲負數的符號擴展)或值大於32位(這不太可能)。

0

在C#這是相同的,但沒有宏:

INT結果=(N >> 24)&爲0xFF;

0

這是將L的位值向右移位24位,(我不知道LPARAM是什麼/它有多長,所以我不能告訴你剩下的是什麼),然後它是位 - 將值與0xFF進行邏輯與運算,以便僅保留變量的其餘8位值。