封裝了P2P連線與資料傳送過程的DLL正式版-PPQ.DLL v1.0(三) (轉)

worldblog發表於2007-12-13
封裝了P2P連線與資料傳送過程的DLL正式版-PPQ.DLL v1.0(三) (轉)[@more@]


十四 PTask類中的說明

* 函式名稱:
*  EndThread()
*
* 引數:
*  BYTE  bySuffix  -對執行緒組中的哪一個執行緒進行操作的標識。
  當取值為0和最大執行緒個數之間的值時,表示終止指定的執行緒。
  當取值為OPER_FIRST_ELEMENT時,表示終止執行緒組中第一個正在執行的執行緒。
  當取值為OPER_LAST_ELEMENT時,表示終止執行緒組中的最後一個正在執行的執行緒。
  當取值為OPER_ALL_ELEMENT時,表示終止執行緒組中所有正在執行的執行緒。

  關於OPER_FIRST_ELEMENT,OPER_LAST_ELEMENT,OPER_ALL_ELEMENT的定義,請查閱PDefine.h在列舉中定義的以 OPER_ 打頭的常量。
*
* 返回值:
*  無
*
* 說明:
*  終止執行緒組中的一個執行緒。這是一個可以的函式,如果執行緒組中的執行緒不存在,函式不會進行任何操作。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetCompletedSize()
*
* 引數:
*  無
*
* 返回值:
*  D  -返回已經或傳送的檔案的總的尺寸。
*
* 說明:
*  該函式返回當前下載或傳送任務已經完成的總的尺寸。

  注意:  只有當第一個下載或傳送執行緒啟動後,該值才有效。函式並不檢測在PTask中規定的執行緒型別,因此,如果執行緒型別不是接收或傳送型別,返回的值無實際意義。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetCurrentRunningThreadNo()
*
* 引數:
*  無
*
* 返回值:
*  BYTE  -返回當前執行緒組中已經啟動的執行緒的個數。
*
* 說明:
*  得到當前已經啟動的執行緒的個數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetPrivateAttribute()
*
* 說明:
*  該函式是DLL內部呼叫的函式,可以返回指定的私有屬性的值,其引數在每次DLL啟動時都不相同,因此,不要在外部去試圖透過該函式去訪問私有屬性。

*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetThreadIDInArray()
*
* 引數:
*  BYTE  bySuffix  -執行緒線上程組中的下標號。取值範圍在0和當前執行緒組的最大執行緒個數之間。
*
* 返回值:
*  LPPTHREADID  -指定執行緒的PTHREADID結構的指標。
*
* 說明:
*  該函式返回執行緒組中指定執行緒的PTHREADID結構的指標。
  該函式是一個可以安全呼叫的函式,如果執行緒組中指定的執行緒不存在,則返回NULL。

  注意:  PTHREADID結構中的屬性將影響執行緒的執行狀態,不要去償試修改這些值。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetTaskType()
*
* 引數:
*  無
*
* 返回值:
*  BYTE  -任務型別的標識。
*
* 說明:
*  該函式將返回PTask物件中的任務的型別標識。一個PTask物件可以表示一組執行緒,這一組執行緒共同完成同一個任務。
 
  關於任務型別的標識請查閱PDefine.h檔案在列舉中定義的以 TASK_ 打頭的常量。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  InitValue()
*
* 引數:
*  無
*
* 返回值:
*  bool  -是否初始化成功。
*
* 說明:
*  該函式初始化PTask物件中所有的值,使PTask物件可以重用。
 
  注意:  該函式會檢測執行緒組中的執行緒是否已全部終止,如果執行緒組的執行緒已全部終止,則函式對PTask物件進行初始化,使其可以重用,並返回true。否則,函式不進行任何操作,返回false。這時PTask物件仍然保持原有的狀態。

  關於該函式在何時使用,請查閱PDefine.h檔案中的訊息說明。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  IsTaskCompleted()
*
* 引數:
*  無
*
* 返回值:
*  DWORD  -表明PTask物件的任務的完成狀態。0表示任務已全部完成。非0值表示當前任務完成的狀態。
*
* 說明:
*  該函式檢測PTask物件的任務是否已全部完成,並返回當前的完成狀態,表明當前任務已經進行到了哪一步。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  ResumeThread()
*
* 引數:
*  BYTE  bySuffix  -對執行緒組中的哪一個執行緒進行操作的標識。
  當取值為0和最大執行緒個數之間的值時,表示使指定的執行緒重新執行。
  當取值為OPER_FIRST_ELEMENT時,表示使執行緒組中第一個被掛起的執行緒恢復執行。
  當取值為OPER_LAST_ELEMENT時,表示使執行緒組中的最後一個被掛起的執行緒恢復執行。
  當取值為OPER_ALL_ELEMENT時,表示使執行緒組中所有被掛起的執行緒恢復執行。

  關於OPER_FIRST_ELEMENT,OPER_LAST_ELEMENT,OPER_ALL_ELEMENT的定義,請查閱PDefine.h檔案在列舉中定義的以 OPER_ 打頭的常量。
*
* 返回值:
*  DWORD  -如果執行緒被恢復執行或該執行緒不存在,則返回0xFFFFFFFF。如果執行緒原先已經處於執行狀態,返回執行緒處於執行狀態的計數器,不作任何操作,執行緒繼續處於執行狀態。
*
* 說明:
*  使掛起的執行緒重新執行。這是一個可以安全呼叫的函式。
 
  注意:  如果引數為OPER_ALL_ELEMENT,返回值始終為0xFFFFFFFF。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SafeRelease()
*
* 型別:
*  靜態函式。
*
* 引數:
*  無
*
* 返回值:
*  無
*
* 說明:
*  呼叫該函式將安全地刪除這個PTask物件。

  注意:  在刪除一個PTask物件時,應該始終呼叫這個方法來刪除物件。
 
  在呼叫該函式前,應該將PTask物件從外部儲存的列表中清除,一旦呼叫該函式,這個PTask物件將不可以再利用。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SetMaxThreadNo()
*
* 引數:
*  BYTE  byNo  -想設定的最大執行緒的個數。取值範圍0..10
*
* 返回值:
*  BYTE  -當前執行緒組被設定的最大執行緒個數。
*
* 說明:
*  該函式用來設定執行緒組被允許啟動的最大執行緒的個數。
 
  注意:  如果執行緒組中已經有執行緒處於執行狀態,則該函式不作任何操作,只是簡單地返回原先設定的最大執行緒個數。

  線上程組中沒有執行緒被啟動時,該方法會改變最大執行緒個數為指定的執行緒個數。

  當引數的值等於GET_MAX_THREAD_NO時,該函式返回原先設定的最大執行緒個數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  StartTask()
*
* 引數:
*  BYTE  byType  -任務的型別
*  DWORD  dwReTryCount=0  -當連線發生錯誤時的重試次數。0表示無限次重試。
*
* 返回值:
*  無
*
* 說明:
*  該函式將開始與pFriend屬性中的好友物件去建立連線,然後byType引數規定的任務。

  特別注意:  當執行緒的型別為TASK_TCP_RECV、TASK_TCP_SEND、TASK_HTTP_RECV時,DLL的外部應該在建立PTask物件時,儲存該物件的指標,以便將來查詢。

  但是當型別為其它型別時,不要儲存PTask物件的指標,因為DLL在連線被建立或超時後,會delete這個PTask物件。

  刪除一個PTask物件時,應該呼叫PTask物件的SafeRelease()來刪除這個物件,以釋放資源,不要使用delete來直接刪除該物件。

  關於連線被建立或超時後發出的訊息,請查閱PDefine.h檔案中的訊息說明。

  現在可以選擇的連線型別包括以下幾種:
  TASK_TCP_SEND  -表明任務的型別為傳送指定檔案,自動採用多執行緒傳送。

  TASK_TCP_RECV  -表明任務的型別為接收指定檔案,自動採用多執行緒接收。

  TASK_HTTP_RECV  -表明任務的型別為從指定上透過HTTP方式下載檔案。 會根據伺服器端是否支援斷點續傳來決定是否採用多執行緒方式下載。

  TASK_TCP_CHAT  -表明任務的型別為TCP連線,可以實現語音傳輸。

  TASK_TCP  -表明連線的雙方都在採用這個DLL來接收指令物件,當雙方建立連線並透過了身份驗證後,會將已經建立好TCP連線的SOCKET控制程式碼提交給DLL外部去處理,DLL不再記錄和處理與該SOCKET相關的任何訊息。這個SOCKET連線仍然可以透過呼叫PDefine中定義的靜態方法來實現指令物件的傳送和接收。

  TASK_TCP_USER  -表明連線的另一方沒有采用這個DLL,它不能夠解析指令物件,因為這個型別的連線只是建立了一個標準的TCP連線,雙方都沒有傳遞和接收過任何的訊息。該連線被建立後,會將SOCKET控制程式碼提交給DLL外部去處理,DLL不再記錄和處理與該SOCKET相關的任何訊息。你不應該使用這個SOCKET去傳送指令物件,因為對方可能無法正確地解析你傳遞的資料流。

  對後續版本的支援:  以上的所有連線方式都會根據你本身是否處在內,而進行相關的處理,不管被連線方是否處在防火牆內,都能正確地與對方建立連線。

  關於突破防火牆建立連線,在現在的版本中還未實現。因為最近在忙於編寫一個圖象合成的,因此這方面的還未來得及編寫,在後續的版本中將實現該功能。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SuspendThread()
*
* 引數:
*  BYTE  bySuffix  -對執行緒組中的哪一個執行緒進行操作的標識。
  當取值為0和最大執行緒個數之間的值時,表示使指定的執行緒掛起。
  當取值為OPER_FIRST_ELEMENT時,表示使執行緒組中第一個正在執行執行緒掛起。
  當取值為OPER_LAST_ELEMENT時,表示使執行緒組中的最後一個正在執行的執行緒掛起。
  當取值為OPER_ALL_ELEMENT時,表示使執行緒組中所有正在執行的執行緒掛起。

  關於OPER_FIRST_ELEMENT,OPER_LAST_ELEMENT,OPER_ALL_ELEMENT的定義,請查閱PDefine.h檔案在列舉中定義的以 OPER_ 打頭的常量。
*
* 返回值:
*  DWORD  -如果執行緒被掛起或該執行緒不存在,則返回0xFFFFFFFF。如果執行緒原先已經被掛起,返回執行緒被掛起的計數器,不作任何操作,執行緒繼續處於掛起狀態。
*
* 說明:
*  使執行緒掛起,這是一個可以安全呼叫的函式。
 
  注意:  如果引數為OPER_ALL_ELEMENT,返回值始終為0xFFFFFFFF。

 

十五 PTask類中的屬性說明

* 屬性定義:
*  bool  m_bIsSendMsg
*
* 型別:
*  這個屬性在訊息的響應函式中被賦值。預設值為true。
*
* 說明:
*  當這個屬性的值為true時,執行緒在每接收或傳送了一定量的資料後,就會向DLL外部傳送OMSG_SEND_DATA和OMSG_RECV_DATA訊息。但每次傳送了訊息後,該值都會被設定為false,因此,如果你希望去響應這個兩訊息,你需要在這兩個訊息的響應函式中設定PTask物件中的該屬性的值為true。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  DWORD  m_dwFileID
*
* 型別:
*  預設值為0。
*
* 說明:
*  表示想接收或傳送的檔案的數字標識。
  如果型別為RECV_TYPE或SEND_TYPE,必需設定該屬性的值為一個正確的數字標識。

  對後續版本的支援:  使用數字標識,而不是使用檔名來表示一個檔案,主要是為了安全性和將來的擴充套件性。在後續的版本中,將提供方法來實現如何將真實的檔名儲存為數字標識,並會實現如何為一個數字標識設定訪問。

  關於如何實現數字標識的問題,請查閱PDefine.h檔案中的回撥函式說明。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  DWORD  m_dwntify 
*
* 型別:
*  這個屬性必需在建立一個PTask物件時就賦與。
*
* 說明:
*  一個表明該物件的身份標識,是DLL向外部傳送訊息時傳遞的一個標識,你透過這個標識應該可以正確的查詢到PTask物件。

   通常的作法是在DLL外部使用一個列表來儲存型別為TASK_TCP_RECV、TASK_HTTP_RECV和TASK_TCP_SEND這些需要啟動執行緒組的PTask物件的指標,這個屬性的值中實際儲存的是指向該PTask物件的指標。當接收到訊息時,首先在列表中檢查該指標是否存在,如果不存在,則表明物件已經被delete,丟棄該訊息,如果指標被查到,則表明物件存在,可以放心的操作。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  DWORD  m_dwSendFileDossTime
*
* 型別:
*  預設值=10,單位為毫秒。
*
* 說明:
*  表明每傳送一個資料塊時,執行緒的休眠時間。它的值決定了傳送檔案時的最度。值越小,傳送速度越快,但的佔用率也越高,反之亦然。

  注意:  它只表示傳送檔案的最快速度,實際的傳送速度會根據對方的接收速度和線路質量進行動態地調整。當對方的接收速度過慢或線路質量不好,造成不斷地重傳時,這個值會增加,以適應對方的接收速度。

  在傳送過程中這個值一旦被增加,就不會再減少,因此它只表示傳送的最快速度。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  LPPRECVINFO  m_lprRecvInfo
*
* 型別:
*  預設值=NULL
*
* 說明:
*  指向PRECVINFO結構的指標。
  當執行緒型別為TASK_TCP_RECV或TASK_HTTP_RECV時,必需設定該值指向一個有效的PRECVINFO結構。

  關於PRECVINFO結構的說明,請查閱PDefine.h中的結構說明。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  LPPMSGINFO  m_lprMsgInfo
*
* 型別:
*  預設值=&PDefine::rSMsgInfo。
*
* 說明:
*  指向PMSGINFO結構的指標。該結構內儲存了接收DLL向外部傳送訊息時的相關引數。

  關於PMSGINFO結構的說明,請查閱PDefine.h中的結構說明。
  關於DLL向外部傳送的訊息的說明,請查閱PDefine.h中的訊息說明。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  PFCALLBACK  m_pCallBackFun
*
* 型別:
*  預設值=NULL
*
* 說明:
*  指向處理DLL傳送的訊息的回撥函式的指標。
  如果設定了回撥函式,則不再向視窗傳送訊息。

  注意:  應該儘量使用訊息,而不要使用回撥函式,即使使用了回撥函式,也不要在函式中處理長延時的操作。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  PFriend*  m_pFriend
*
* 型別:
*  預設值為空。
*
* 說明:
*  指向好友PFriend物件的指標。PFriend物件中儲存了進行連線時所用到的和埠號。

  除了型別為TASK_HTTP_RECV時,不需要指定PFriend物件,其它的型別都必需指定PFriend物件,並且設定好PFriend物件中的IP地址和埠號。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  WORD  m_wSendMsgRate

*
* 型別:
*  預設值=PDefine::wSendMsgRate,只有在型別為接收或傳送時有效。
*
* 說明:
*  這個屬性的值決定了當前PTask物件在傳送和接收的過程中向DLL外部傳送OMSG_SEND_DATA和OMSG_RECV_MSG訊息時的速度。

 

十六 PBaseAct中的函式說明

* 函式名稱:
*  GetCallBackMsg()
*
* 型別:
*  虛擬函式,如果派生類希望使用訊息來處理所接收到的該類的例項,必需具體實現該方法。
*
* 引數:
*  無
*
* 返回值:
*  LPPMSGINFO  -指向PMSGINFO結構的指標或NULL。
*
* 說明:
*  當DLL接收到一個自定義物件時,首先會呼叫該函式,如果該函式返回為NULL,則呼叫GetParseActFunPointer()函式返回的回撥函式來處理該指令物件。如果該函式返回了一個PMSGINFO結構的指標,則DLL將會向PMSGINFO結構中指定的窗體傳送指定的訊息。
 
  訊息的lParam引數,儲存了指向該物件的指標。
  在訊息的響應函式的最後,應該delete這個指令物件,以釋放。

  舉例如下:
  LPPMSGINFO GetCallBackMsg()
  {
  return &PDefine::rSMsgInfo;
  }
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetCallBackPointer()
*
* 型別:
*  不可覆蓋的函式。
*
* 引數:
*  無
*
* 返回值:
*  PDHANDLE  -接收該指令物件資料流的物件的控制程式碼。
*
* 說明:
*  返回接收該指令物件資料流的物件的手柄。如果你在處理指令的過程中,需要通知接收該指令的SOCKET物件去實現一些特定的操作,可以透過呼叫PDefine::SNotifyConnectSrc()靜態方法來實現一個通知。該函式返回的控制程式碼是PDefine::SNotifyConnectSrc()方法所需要的引數。

  關於PDefine::SNotifyConnectSrc()方法請查閱PDefine.h檔案中的函式說明。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetObjType()
*
* 型別:
*  虛擬函式,派生類不要過載該函式。DLL內部定義的派生類,才使用標識。
*
* 引數:
*  無
*
* 返回值:
*  BYTE  -自定義物件的標識。
*
* 說明:
*  該函式返回表示該物件的標識。過載該函式不會起任何作用。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetClassID()
*
* 型別:
*  虛擬函式,派生類必需具體實現該方法。
*
* 引數:
*  無
*
* 返回值:
*  LPCTSTR  -派生類的ClassID,唯一標識一個類。
*
* 說明:
*  返回唯一標識派生類的ClassID。對於PBaseAct的派生類,必需規定一個唯一的ClassID。

  關於ClassID的命名,目前並沒有一個統一的規定,可以是任意長度的一串字元。如果使用者定義的類只在自己的程式中使用,則不需要過載該方法。

  ClassID可以由字元a..z、A..Z、0..9、_和+、- 、#等組成。

  ClassID使程式不但可以支援開發者自己建立的類,而且可以支援其他開發者建立的類,而不需要修改程式。

  開發者可以將自己定義的PBaseAct派生類和相應的類物件解析程式打包成一個DLL,直接釋出出來,隱藏具體的實現細節,提供足夠的介面,使其他開發者可以直接呼叫這些物件來完成指定的功能。但注意,在釋出自己的派生類時,必需提供一個唯一的ClassID。

  關於ClassID的生成,可以參考OCX的ClassID的生成。

  注意:  ClassID對於每一個相同的類都是一樣的,ClassID區別的是類,而不是物件。

  雖然ClassID可以唯一標識一個類,但是類名還是有可能重複,在每個人獨立開發的情況下,這個問題肯定會存在的。

  解決的辦法是可以採用類似於類的命名,使用域名+目錄名+類名的方式來命名一個類,但中間不用使用'.'符號。

  如果你能夠很好地將派生類與相應的指令解析程式封裝到DLL中,而對外只提供介面,而不提供對物件的直接訪問,那麼你定義的派生類可以是任意的名字,因為它只在你的DLL內部建立和析構。

  舉例如下:
  virtual LPCTSTR GetClassID()
  {
  return "ABCDE-12345-xxxxx-Ab12X";
  }
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  GetParseActFunPointer()
*
* 型別:
*  虛擬函式,如果派生類希望使用函式來處理所接收到的該類的例項,必需具體實現該方法。
*
* 引數:
*  無
*
* 返回值:
*  GETCALLBACK  -回撥函式的地址。
*
* 說明:
*  返回處理自定義的PBaseAct派生類物件的回撥函式的地址。
  該函式和GetCallBackMsg()函式你只用實現一個,如果你過載了GetCallBackMsg()函式,則不需要再過載該函式,DLL會優先處理GetCallBackMsg()函式。

  如果你沒有過載GetCallBackMsg()函式,則你必需過載該函式,否則自定義的指定物件會被刪除,而得不到處理。

  注意:  如果你過載了該函式,則在回撥函式的最後,應該Delete傳遞的指令物件。

  關於回撥函式的原形請查閱PDefine.h檔案中的回撥函式說明。

  舉例如下,其中GlobalFunParseUserObj()函式是一個GETCALLBACK回撥函式:
  virtual GETCALLBACK* GetParseActFunPointer()
  {
  return GlobalFunParseUserObj;
  }
 
  也可以為每一個派生類指定一個不同的處理函式,這時無需比較型別,每個派生類的處理函式都是該派生類中的一個靜態方法。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  Init()
*
* 型別:
*  虛擬函式,派生類必需具體實現該方法。該函式由DLL在反序列化時自動呼叫。
*
* 引數:
*  PDHANDLE  handle  -物件的控制程式碼。
*
* 返回值:
*  無
*
* 說明:
*  該函式實現指令物件的反序列化,將資料流中傳遞的物件的各屬性的具體值傳遞給物件中相應的屬性。

  舉例如下:
  virtual void InitObject(PDHANDLE handle);
  { 
  //該方法的第一句必需呼叫基類的方法。
  PBaseAct::InitObject(handle);

  //按照你在SelfSerialize()方法中序列化屬性時的順序,
  //依次呼叫靜態方法int SGetValue(data,&value)
  //其中的value是屬性的變數名稱,可以是一個CString、int或CStringEx型別的變數。
 
  //SGetValue()方法會返回當前屬性的順序號。順序號從2開始計數。
  //順序號的0是傳送者ID,1是該物件的版本號。在基類的方法中會自動分解得到這些值。
  }
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SelfSerialize()
*
* 型別:
*  虛擬函式,派生類必需具體實現該方法。該函式在需要傳遞指令物件時序列化物件。
*
* 引數:
*  char*  src  -儲存指令序列化成資料流的緩衝區的地址緩衝區的大小可以為NULL或任意長度,在序列化的過程中緩衝區的大小會根據需要而增加,但不會減少。
*  DWORD&  dwLen  -當前資料流的長度,這個值會在序列化過程中改變。
*  DWORD&  dwBufferLen  -緩衝區的長度,這個值會在序列化過程中改變。
*
* 返回值:
*  char*  -資料流緩衝區的地址。始終應該將返回的值賦與儲存緩衝區地址的變數。如果緩衝區的尺寸小於資料流的尺寸,則DLL會負責重新建立一個足夠大小的緩衝區,原緩衝區的資源會被釋放。
*
* 說明:
*  該函式實現指令物件的序列化,以形成可以由SOCKET傳送的資料流。

  舉例如下:
  virtual char* SelfSerialize(char* src,DWORD& dwLen,DWORD& dwBufferLen)
  { 
  //首先要清空指令的長度。
  dwLen=0;
  {
  //將想序列化的屬性依次呼叫PBaseAct::untLen()方法,計算物件的長度。
  //下面是以三種不同的型別舉的例子,在實際的派生類中根據想傳輸的屬性
  //呼叫SCountLen()方法。

  //計算一個BYTE型別的屬性m_byValue的長度,傳遞的是值。
  PBaseAct::SCountLen(dwLen,this->m_byValue);

  //計算一個CStringEx型別的屬性m_cEx的長度,傳遞的是地址。
  PBaseAct::SCountLen(dwLen,&this->m_cEx;);

  //計算一個CString型別的屬性m_strString的長度,傳遞的是地址。
  WORD i=PBaseAct::SCountLen(dwLen,this->m_strString,this->m_strString.GetLength());
  }

  //等想序列化的屬性都呼叫SCountLen()方法計算了長度後,
  //呼叫SInitUniteValue()靜態方法初始化物件流。
  src=PBaseAct::SInitUniteValue(src,dwLen,dwBufferLen,this);
  {
  //然後呼叫SUniteValue()方法依次序列化屬性的值,以形成資料流。
  //下面是以三種不同的型別舉的例子,在實際的派生類中根據想傳輸的屬性
  //呼叫SUniteValue()方法。

  //序列化BYTE型別的屬性m_byValue,傳遞的是值。
  this->SUniteValue(src,dwLen,this->m_bynValue);

  //序列化CStringEx型別的屬性m_cEx,傳遞的是地址。
  this->SUniteValue(src,dwLen,&this->m_cEx);

  //序列化CString型別的屬性m_strString,傳遞的是地址。
  //i值是前面呼叫SCountLen()時被傳回的值。
  this->SUniteValue(src,dwLen,this->m_strString,i);
  }

  //在函式的最後,一定要呼叫基類的SelfSerialize()方法。
  PBaseAct::SelfSerialize(src,dwLen,dwBufferLen);
 
  //返回序列化後所產生的資料流。
  return src;
  }
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCountLen()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  DWORD&  dwLen  -指令字的有效長度。該引數應該直接使用SelfSerialize()方法中傳遞的第2個引數dwLen。
*  int  value  -一個int型別的PBaseAct派生類中的屬性的值。
*
* 返回值:
*  無
*
* 說明:
*  計算一個int型別的屬性的長度。
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCountLen()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  DWORD&  dwLen  -指令字的有效長度。該引數應該直接使用SelfSerialize()方法中傳遞的第2個引數dwLen。
*  CStringEx*  pEx  -一個CStringEx型別的PBaseAct派生類中的屬性的地址。
*
* 返回值:
*  無
*
* 說明:
*  統計CStringEx型別的屬性的長度。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCountLen()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  DWORD&  dwLen  -指令字的有效長度。該引數應該直接使用SelfSerialize()方法中傳遞的第2個引數dwLen。
*  LPCTSTR  value  -一個CString型別的PBaseAct派生類中的屬性的資料緩衝區指標。
*  DWORD  dwCount=0  -字串的長度。可預設。最好是給出,否則程式將自動計數字符串緩衝區的長度。字串必需以''作為終結符。
*
* 返回值:
*  DWORD  -當前字串的長度。
*
* 說明:
*  統計CString型別的屬性的長度。
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在InitObject()方法中呼叫。
*
* 引數:
*  PDHANDLE  handle  -物件的控制程式碼,由InitObject()方法傳遞。
*  CString*  src  -一個CString型別的PBaseAct派生類中的屬性的地址。
*
* 返回值:
*  無
*
* 說明:
*  從資料流中得到一個字串,並賦給指定的CString物件。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetValue  ()
*
* 型別:
*  protected 靜態函式。該方法只應該在InitObject()方法中呼叫。
*
* 引數:
*  PDHANDLE  handle  -物件的控制程式碼,由InitObject()方法傳遞。
*  int*  src  -一個int型別的PBaseAct派生類中的屬性的地址。
*
* 返回值:
*  無
*
* 說明:
*  從資料流中得到一個int值,並賦給指定的int物件。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在InitObject()方法中呼叫。
*
* 引數:
*  PDHANDLE  handle  -物件的控制程式碼,由InitObject()方法傳遞。
*  CStringEx*  src  -一個CStringEx型別的PBaseAct派生類中的屬性的地址。
*
* 返回值:
*  無
*
* 說明:
*  從資料流中得到一個二進位制流緩衝,並填充資料到指定的CStringEx物件中。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SInitUniteValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  char*  src  -形成資料流的緩衝區的首地址。由SelfSerialize()方法傳遞。
*  DWORD&  nLen  -資料流的有效長度。由SelfSerialize()方法傳遞。
*  DWORD&  dwBufferLen  -資料流緩衝區的尺寸。由SelfSerialize()方法傳遞。
*  PBaseAct*  pb  -想序列化的物件的指標。應該傳遞this。
*
* 返回值:
*  char*  -新的資料流的緩衝區的首地址。應該賦於src。
*
* 說明:
*  初始化資料流。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SUniteValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  char*  src  -形成資料流的緩衝區的首地址。由SelfSerialize()方法傳遞。
*  DWORD&  nLen  -資料流的有效長度。由SelfSerialize()方法傳遞。
*  int  value  -想序列化的int屬性的值。
*
* 返回值:
*  無
*
* 說明:
*  將整數value的值增加到資料流中。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SUniteValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  char*  src  -形成資料流的緩衝區的首地址。由SelfSerialize()方法傳遞。
*  DWORD& nLen  -資料流的有效長度。由SelfSerialize()方法傳遞。
*  LPCTSTR  value  -想序列化的CString物件的資料緩衝區的首地址。
*  DWORD  dwCount=0 -CString物件的字串資料的長度。
*
* 返回值:
*  無
*
* 說明:
*  將字串value增加到資料流中。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SUniteValue()
*
* 型別:
*  protected 靜態函式。該方法只應該在SelfSerialize()方法中呼叫。
*
* 引數:
*  char*  src  -形成資料流的緩衝區的首地址。由SelfSerialize()方法傳遞。
*  DWORD&  nLen  -資料流的有效長度。由SelfSerialize()方法傳遞。
*  CStringEx*  value  -想序列化的CStringEx物件的首地址。一個CStringEx物件表示一個二進位制流緩衝區。
*
* 返回值:
*  無
*
* 說明:
*  將一個二進位制流緩衝區中的資料增加到資料流中。

 

十七 PBaseAct類中的屬性說明

* 屬性定義:
*  CString  m_strSender
*
* 說明:
*  傳送該指令物件者的ID。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  WORD  m_wOrderNo
*
* 說明:
*  指令的順序號,該值不需要使用者指定。(暫時保留)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992713/,如需轉載,請註明出處,否則將追究法律責任。

相關文章