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

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

十  PPQ.DLL的訊息

*
*  對除特別宣告外的所有訊息都適應的規範
*
*  當接收到一個以PTask的指標作為lParam引數的訊息時,你可以決定是否要繼續使用該物件。
*
*  如果想繼續使用該物件,則先InitValue()方法,InitValue()不會改變原有的賦值。
*
*  如果你想繼續工作,則不用改動已經賦過值的屬性,而直接呼叫StartTask()方法。
*
*  如果你想完成其它的工作,你必需要設定相應的屬性的值,就象你新建立了一個該PTask物件一樣,然後再呼叫StartTask()方法。

*  如果不想繼續使用該物件,你需要delete這個物件。如果你在delete這個物件這前,不希望刪除PRECVINFO結構,你可以儲存該指向該結構的指標,然後設定m_lprRecvInfo=NULL。
*
*  PTask物件中的m_dwntify屬性儲存的是DLL外部在建立PTask物件時為PTask物件設定的標識,透過該標識應該可以正確地得到一個仍然有效的PTask物件。也就是說,當接到該標識的引數時,該標識所表示的PTask物件不一定還是有效的,這個PTask物件可能已經被delete啦,你必需透過檢測,以確保PTask物件是有效的,才能正確地引用這個物件,否則應該丟棄剛收到的這個訊息。這點一定要注意。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_ALL_CONNECT_END
*
* 型別:  必需響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  LPARAM  lParam  -指向PTask物件的指標
*
* 說明:
*  表明一個PTask物件的所有的連線請求都已終止,但是執行緒組中的執行緒並未終止。
  接到該指令時不能delete這個PTask物件。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CREATE_NEW_OBJ
*
* 型別:  必需響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 說明:
  在訊息體中直接呼叫PDefine::SCreateNewObj()靜態方法,
  傳遞wParam和lParam引數。其它不必作任何事情。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CREATE_NEW_THREAD
*
* 型別:  必需響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  LPARAM  lParam  -指向PTask物件的指標
*
* 說明:
*  你可以透過判斷PTask->m_dwIdentify==0來得知該PTask物件是否已設定了標識。
  如果值為0,你需要為這個物件設定一個唯一的標識。而且你還需要去判斷物件的型別,如果型別為TASK_TCP_RECV,則要在堆裡去建立一個PRECVINFO物件,並且初始化這個PRECVINFO結構,並將指標賦與PTask->lprRecvInfo變數。
 
  最後在訊息的響應函式中呼叫PDefine::SCreateNewThread()靜態方法,傳遞wParam
和lParam引數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_MISSION_END
*
* 型別:  必需響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -表明了任務的完成狀態。值為0時,表示任務已經完成。非0值,表示任務的當前狀態。
*  LPARAM  lParam  -指向PTask物件的指標
*
* 說明:
*  表明一個PTask物件的任務已經完成或終止。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_NEW_TCP_CONNECTED
*
* 型別:  必需響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -用來得到SOCKET控制程式碼的關鍵引數。
*  LPARAM  lParam  -指向請求該連線的PFriend物件的指標
*
* 說明:
*  一個由連線方請求的TCP連線被建立。關於該Socket的所有操作,將轉移給DLL外部處理。在響應函式中需要呼叫PDefine::SGetSocketConnected(WPARAM wParam)靜態方法,將wParam作為引數傳遞,來返回已經建立好TCP連線的SOCKET控制程式碼。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_TCP_APPLY_CONNECTED
*
* 型別:  如果用到了TASK_TCP型別的連線,必需響應該訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -已經建立好TCP連線的SOCKET控制程式碼
*  LPARAM  lParam  -指向建立連線的PFriend物件的指標
*
* 說明:
*  一個請求的型別為TASK_TCP的TCP連線已經被成功的建立。
  關於該Socket的所有操作,轉移給DLL外部處理。
  型別為TASK_TCP,表示對方也在使用這個DLL,你可以傳送指令物件。
  雙方已經透過了身份校驗。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_TCP_USER_APPLY_CONNECTED
*
* 型別:  如果使用了TASK_TCP_USER型別的連線,必需響應該訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -已經建立好TCP連線的SOCKET控制程式碼
*  LPARAM  lParam  -指向建立連線的PFriend物件的指標
*
* 說明:
*  一個請求的型別為TCP_USER_TYPE的TCP連線已經被成功的建立。
  關於該Socket的所有操作,轉移給DLL外部處理。
  型別為TASK_TCP_USER,表示對方沒有使用或不確定使用了這個DLL。
  這個連線只是進行了建立,雙方還沒有進行任何的資料傳送。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_A_RECV_THREAD_END
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明一個接收的執行緒結束。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_A_SEND_THREAD_END
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明一個傳送檔案的執行緒結束。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CPATURE_SOUND_RELEASED
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  無意義
*
* 說明:
*  表明一個捕捉裝置被釋放,這個釋放並不是呼叫
  PDefine::SReleaseSoundCaptureDevice()方法而產生的。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CHAT_CONNECT_CLOSED
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  LPARAM  lParam  -指向擁有該連線的PFriend物件的指標
*
* 說明:
*  表明lParam所指定的PFriend物件的聊天Socket被關閉。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CHAT_CONNECT_CREATED
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PDefine::rSMsgInfo結構中定義的窗體。
*
* 引數:
*  LPARAM  lParam  -指向擁有該聊天連線的PFriend物件的指標
*
* 說明:
*  表明一個聊天Socket被建立,並且已經連線到了好友物件上。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_CREATE_CONNECT_FAILED
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -錯誤的原因。查閱錯誤程式碼的列舉定義。
*  LPARAM  lParam  -指向想建立連線的PFriend物件的指標
*
* 說明:
*  表明與PFreind物件無法建立連線,在建立連線時產生了一個錯誤。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_MAX_THREAD_NO_CREATED
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明lParam所指的PTask物件已經建立了最大的執行緒個數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_RECV_DATA
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明接收到了新的資料資訊。
  在訊息的響應函式中,你需要設定PTask中的屬性m_bIsSendMsg=true,否則無法再接收到該任務所發出的該訊息。
  在PTask中的m_dwCompletedSize屬性中儲存的是總的接收的位元組數。
  你可以呼叫PTask物件的GetThreadIDInArray((BYTE)wParam)來獲得該執行緒所在的PTHREADID結構的指標。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_RECV_NEW_BLOCK
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明接收執行緒準備接收一個新分配的塊號。
  你可以呼叫PTask物件的GetThreadIDInArray((BYTE)wParam)來獲得該執行緒所在的  PTHREADID結構的指標。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_SEND_DATA
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明傳送了新的資料資訊。
  在訊息的響應函式中,你需要設定PTask中的屬性m_bIsSendMsg=true,否則無法再接收到該任務所發出的該訊息。
  在PTask中的m_dwCompletedSize屬性中儲存的是總的傳送的位元組數。
  你可以呼叫PTask物件的GetThreadIDInArray((BYTE)wParam)來獲得該執行緒所在的  PTHREADID結構的指標。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 訊息名稱:  OMSG_SEND_NEW_BLOCK
*
* 型別:  可以響應的訊息。
*
* 接收訊息的窗體:
*  在PTask物件的m_lprMsgInfo變數所指的結構中定義的窗體。
*
* 引數:
*  WPARAM  wParam  -低8位表示該執行緒在PTask物件的執行緒組中的標識號
*  LPARAM  lParam  -儲存的是執行緒所在的PTask物件中的m_dwIdentify屬性的值
*
* 說明:
*  表明傳送執行緒準備傳送一個新的部分。
  你可以呼叫PTask物件的GetThreadIDInArray((BYTE)wParam)來獲得該執行緒所在的  PTHREADID結構的指標。

 

十一  PPQ.DLL中定義的結構說明

*
* 結構名稱:  PRECVINFO
*
* 結構指標定義:  LPRECVINFO
*
* 屬性:
*    wSplitNo  -檔案被分割的塊數。如果設定分割塊數為0,  DLL會根據PDefine::dwSBlockMaxSize中的值自動計算分割塊數。

*  CString  strSaveName  -被儲存的檔案的名稱和相對於基準路徑的路徑。如果strSaveName=_T(""),則檔名等於傳送方的檔名。該屬性的值可以包含一個"""。

*  CString  strSaveBasePath  -表示被儲存在本地的檔案的基準路徑。路徑必需以"。

*  CString  strExpendName  -被儲存檔案的副檔名。副檔名不包括"."符號。如果預設,等於請求的檔名的副檔名。

*  CString  strSrvURL  -當型別為TASK_HTTP_RECV時,該屬性必需賦值。表示要連線的的URL地址。

*  下面這些屬性的值由DLL在使用過程中填充,不要去修改這些值。
*  CString  strAddr  -表示伺服器的地址。
*  UINT  nPort  -表示伺服器的埠號。
*  CString  strFileN  -表示要下載的檔名。
*  CString  strReferer  -表示重定向已後的Referer的值。
*  DWORD  dwFileSize  -檔案的總的長度。
*  DWORD  dwBlockLen  -每個塊的長度。
*  char*  lpszBlockMap  -儲存每個分割塊的狀態。第一次呼叫時,賦值為空。
*  DWORD  dwLowDateTime  -被下載的檔案在傳送方的最後修改日期的低32位。
*  DWORD  dwHighDateTime  -被下載的檔案在傳送方的最後修改日期的高32位。
*
* 說明:
*  當申請一個連線用於下載檔案時,必需填寫該結構,並且將指標傳遞給PTask中的m_lprRecvInfo變數。在建立該結構後,一定要使用以下方法初始化結構:
  memset(m_lprRecvInfo,0,DWORD(&m_lprRecvInfo->nPort)-(DWORD)m_lprRecvInfo);

  當型別為TASK_TCP_RECV時,所有的屬性都可以預設。
  當型別為TASK_HTTP_RECV時,必需設定strSrvURL屬性的值,表示想下載的檔案的URL。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 結構名稱:  PTHREADID
*
* 結構指標定義:  LPPTHREADID
*
* 屬性:
*  bool  bIsSuspend  -執行緒是否被掛起。掛起時為true。
*  bool  bIsRun  -執行緒是否執行。執行時為true。
*  PTask*  PTask  -當前執行緒所歸屬的執行緒組物件。
*  int  nBlockNo  -執行緒當前被分配的塊號。
*  BYTE  bySuffix  -標識當前執行緒線上程組中的標識。
*  CWinThread*  pMyThread  -指向這個執行緒的CWinThread物件的指標。
*  SOCKET  sock  -傳遞給執行緒的已經建立好連線的SOCKET物件。
*  CString  strBlockFileN  -當前分割塊所對應的檔名。
*  DWORD  dwOffset  -當前執行緒接收的起始偏移位置。這個偏移已經包含了被接收的長度。
*  DWORD  dwBlockLen  -當前接收塊應該接收的長度。
*  DWORD  dwCompletedLen  -當前塊已被接收或傳送的長度。
*  HANDLE  hEvent  -用來同步的事件控制程式碼。
* 
* 說明:
*  在這個結構中的值,都由DLL在執行過程中填充,不要試圖去修改這些值。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 結構名稱:  PMSGINFO
*
* 結構指標定義:  LPPMSGINFO
*
* 屬性:
*  CWnd*  pWnd  -接收訊息的視窗的指標。
*  UINT  nMsg  -傳送的訊息的標識。
*  bool  bIsAutoDel  -標識該結構是否被自動刪除。如果值為false,需要你自己來刪除。值為true時,表示該結構所歸屬的物件一旦被刪除,該結構也被除。
* 
* 說明:
*  儲存向傳送訊息時的視窗控制程式碼和訊息的標識。


十二 PDefine類中的靜態函式說明

* 函式名稱:
*  SApplyAnPDHANDLE()
*
* 型別:
*  靜態函式。
*
* 引數:
*  無。
*
* 返回值:
*  PDHANDLE  -物件的控制程式碼。
*
* 說明:
*  該函式返回一個用來處理資料流的物件的控制程式碼。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SClosePDHANDLE();

* 型別:
*
* 引數:
*  PDHANDLE  handle  -物件的控制程式碼。 
* 返回值:
*  無。
*
* 說明:
*  該函式關閉一個處理物件流的物件的控制程式碼,以釋放所佔用的資源。
*
*
* 函式名稱: 
*  alitionFile()
*
* 型別:
*  靜態函式。
*
* 引數:
*  LPCTSTR  lpszSrcFileTitle  -儲存在本地的分割檔案的檔案標題。
*  LPCTSTR  lpszExpandN  -檔案的副檔名。
*  LPCTSTR  lpszBasePath  -檔案的基準路徑。
*  LPCTSTR  lpszTargetFileN=NULL  -合併後的檔案的檔名。NULL時表示與塊檔案相同。
*  bool  bAutoDelete=true  -在合併時是否自動刪除塊檔案。
*
* 返回值:
*  DWORD  -如果成功,返回0,否則低16位返回錯誤程式碼,高16位返回在第幾個塊檔案發生錯誤。
*
* 說明:
*  該函式將已下載完成的各個塊檔案合併成單個的檔案。
  當檔案下載完成後,應該使用該函式來完成檔案的合併,以確保對後續版本的支援。該函式會自動檢測檔案是否已全部下載完成,只有檔案全部下載完成後,才會進行合併處理。

  注意:   對只有單個塊的下載檔案,會在下載完成後自動處理。
  如果對單個塊的下載檔案呼叫該函式,會返回檔案不存在的錯誤。

  該函式是一個阻塞式的函式,如果在執行該函式時,不想望阻塞的執行,請在一個執行緒中去呼叫該函式。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetBlockFileName()
*
* 型別:
*  靜態函式。
*
* 引數:
*  LPCTSTR  lpszSaveName  -包含相對於基準路徑的路徑和檔案標題。
*  LPCTSTR  lpszExtName  -檔案的副檔名。
*  LPCTSTR  lpszBasePath  -儲存塊檔案的基準路徑。
*  int  nBlockNo  -檔案的分割塊號。
*  CString*  pstrFileN  -儲存塊檔案的檔名的物件的指標。
*
* 返回值:
*  無。
*
* 說明:
*  該物件根據傳遞的引數形成塊檔案的檔名,並儲存在pstrFileN物件中。
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetSocketConnected()
*
* 型別:
*  靜態函式。
*
* 引數:
*  WPARAM  wParam  -訊息的wParam引數。

* 返回值:
*  SOCKET  -一個已經建立TCP連線的SOCKET控制程式碼。
*
* 說明:
*  在OMSG_NEW_TCP_CONNECTED訊息的響應體中,呼叫該函式,並傳遞wParam引數,將返回一個已經建立TCP連線的SOCKET控制程式碼。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱: 
*  SGetTime()
*
* 型別:
*  靜態函式。
*
* 引數:
*  LPCTSTR  lpszTime  -表示時間的字串。
*
* 返回值:
*  CTime  -該字串所表示的時間物件。
*
* 說明:
*  該函式將一個表示時間的字串轉換成CTime物件。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SRecvAct()
*
* 型別:
*  靜態函式。
*
* 引數:
*  SOCKET  sock  -想接收資料流的SOCKET控制程式碼。
*  int&  nCount  -該次操作所接收到的資料的位元組數。
*  PDHANDLE  handle  -一個物件的控制程式碼。

* 返回值:
*  PBaseAct*  -如果接收到的資料流是一個指令物件,則返回指向該指令物件的指標。否則返回NULL。
*
* 說明:
*  該函式去讀取指定SOCKET的緩衝區中的資料,以形成指令物件。
 
  注意:  從第一次接收資料,一直到指令的形成,都應該使用同一個PDHANDLE控制程式碼,否則資料流無法正確接收,最好的辦法是為每一個SOCKET連線去申請一個PDHANDLE控制程式碼。PDHANDLE控制程式碼可以透過呼叫SApplyAnPDHANDLE()方法得到,或者是DLL內部傳遞的控制程式碼。

  該方法是一個非阻塞方法,如果SOCKET緩衝區中沒有可讀取的資料,將立即返回。該方法不保證一次呼叫就會讀取緩衝區中的所有資料,因此應在外部透過()方法檢測是否有可讀取的資料或在OnReceive訊息響應函式中呼叫該方法。

  如果該函式執行後,nCount的值為0,表示沒有讀取到任何的資料。這時有可能SOCKET連線已經斷開。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SSendFromSocket()
*
* 型別:
*  靜態函式。
*
* 引數:
*  SOCKET  sock  -一個已經建立TCP連線的SOCKET控制程式碼。
*  char*  src  -經過序列化的指令物件的資料流。
*  WORD  wLen  -資料流的長度。

* 返回值:
*  無。
*
* 說明:
*  該函式將指令物件所表示的資料流透過指定的SOCKET傳送出去。

  注意:  該SOCKET所連線的雙方都必需在使用這個DLL來解析資料,否則傳送出去的資料流對方是無法解析的。
 
  src和wLen是你在呼叫指令物件的SelfSerialize()方法時傳遞的引數。
  在SelfSerialize()方法中的dwLen引數,從DWORD被強制轉換成WORD,表明在你序列化指令物件時的資料流長度不能超過65535。

  如果你的資料流中要傳送大型的資料,你可以在指令物件中使有CStringEx物件來儲存大型的資料,使傳送可以超過65535位元組的任意大小的資料流。
  (具體方法可以參照PBaseAct中的說明)
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetSoundCaptureDeviceList()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  HWND  hCaptureDeviceCombo  -CComboBox物件的m_hWnd屬性的值。指定填充可利用的聲音捕捉裝置列表的組合框。引數值可以為NULL。CComboBox物件不要排序。

* 返回值:
*  無
*
* 說明:
*  該函式將控測可利用的聲音捕捉裝置名稱,並填充在hCaptureDeviceCombo引數指定的CComboBox物件中。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SInitSoundCaptureDevice()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  HWND  hCaptureDeviceCombo  -在SGetSoundCaptureDeviceList()方法中傳遞的引數。如果值為空,則dwIndex引數起作用。
*  DWORD  dwIndex=0  -指定選擇探測到的第幾個捕捉裝置。如果第1個引數不為NULL,則該引數不起作用。
*
* 返回值:
*  UINT  -成功則返回0值,否則為錯誤程式碼。當返回為錯誤程式碼時,聲音捕捉裝置被自動釋放。
*
* 說明:
*  初始化指定的捕捉裝置用於聲音捕捉。

*  注意:  該函式在呼叫PDefine::SReleaseSoundCaptureDevice()方法之前,只能被執行一次。超過一次的執行,都會返回一個ERR_NO_CAPTURE_DEVICE錯誤。

  在呼叫該方法前,可以由使用者在CComboBox列表中選擇指定的裝置,待使用者選定後,再呼叫該方法,該方法會提取使用者的選擇。

  當第一個引數為NULL,第二個引數預設時,表示選擇檢測到的第一個可利用裝置。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetSoundCaptureAvailableFormats()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  HWND  hListBox  -CListBox物件的m_hWnd屬性的值。指定填充聲音捕捉裝置可利用的格式的列表框。引數可以為空。CListBox物件不要排序。
*
* 返回值:
*  無
*
* 說明:
*  該函式將檢測選定的捕捉裝置可利用的音訊格式,並填充在hListBox引數指定的CListBox物件中。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCreateSoundCaptureBuffer()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  HWND  hListBox  -在SGetSoundCaptureAvailableFormats()方法中傳遞的引數。如果值為空,則dwIndex引數起作用。
*  DWORD  dwFormatsIndex=8  -指定選擇檢測到的第幾個音訊格式。如果第1個引數不為NULL,則該引數不起作用。
*
* 返回值:
*  UINT  -成功則返回0值,否則為錯誤程式碼。當返回為錯誤程式碼時,聲音捕捉裝置被自動釋放。
*
* 說明:
*  為聲音捕捉裝置建立錄音緩衝區。

  注意:  在呼叫該方法前,可以由使用者在CListBox列表中選擇指定的格式,待使用者選定後,再呼叫該方法,該方法會提取使用者的選擇。

  當第一個引數為NULL,第二個引數預設時,表示選擇預設的音訊格式。
  預設的音訊格式為22.05KHz,8位,單通道,單聲道格式。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SSetSoundCaptureAcceptdFriend()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  PFriend*  pFriend  -好友物件的指標。

* 返回值:
*  無
*
* 說明:
*  該函式設定捕捉到的聲音被傳送給哪一個好友物件。
  如果與該好友物件之間沒有建立連線,則傳送被忽略。
  你可以在聲音捕捉建立後的任何一個時間去呼叫這個函式。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SRecordSound()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  UINT  -成功則返回0值,否則為錯誤程式碼。當返回為錯誤程式碼時,聲音捕捉裝置被自動釋放。
*
* 返回值:
*  無
*
* 說明:
*  開始進行聲音捕捉。
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SStopRecordSound()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  無

* 返回值:
*  UINT  -成功則返回0值,否則為錯誤程式碼。當返回為錯誤程式碼時,聲音捕捉裝置被自動釋放。
*
* 說明:
*  暫時停止聲音捕捉,這時聲音捕捉裝置並未被釋放,你可以透過再次呼叫PDefine::SRecordSound()方法重新開始聲音捕捉。
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SReleaseSoundCaptureDevice()
*
* 型別:
*  靜態函式。與聲音捕捉相關的函式。
*
* 引數:
*  無

* 返回值:
*  無
*
* 說明:
*  停止捕捉聲音,釋放聲音捕捉聲備所佔用的資源。
  該函式是一個的函式,即使你沒有成功建立聲音捕捉裝置,你仍然可以(應該)呼叫該函式,以確保聲音捕捉裝置被釋放。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SPlaySound()
*
* 型別:
*  靜態函式。與聲音回放相關的函式。
*
* 引數:
*  DWORD  dwFormatsIndex=8  -聲音的音訊格式的。該索引與SGetSoundCaptureAvailableFormats()方法返回的索引是完全相同的。
*
* 返回值:
*  無
*
* 說明:
*  開始播放聲音。呼叫該函式後,程式會自動從傳送過來的聲音緩衝區中取出資料,然後播放,如果緩衝區中沒有資料,會播放靜音。

  注意:  因為播放聲音應該根據對方傳遞的錄音格式來進行播放,因此,播放的格式實際上不需要去選擇。
 
  另外,在進行網際傳輸的過程中,將會根據線路質量,來動態的減少或增加音訊取樣頻率,以達到最佳的效果,因此,每一段傳送的音訊的格式都可能不一樣。

  在傳送聲音資料的同時,已經包含了該次聲音資料的格式,只是這一段切換播放聲音格式的程式暫時沒有實現。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SStopPlaySound()
*
* 型別:
*  靜態函式。與聲音回放相關的函式。
*
* 引數:
*  無

* 返回值:
*  無
*
* 說明:
*  暫時停止聲音播放,這時聲音回放裝置的資源並沒有釋放。
  可以透過呼叫PDefine::SPlaySound()方法繼續聲音回放。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SReleaseSoundPlayDevice()
*
* 型別:
*  靜態函式。與聲音回放相關的函式。
*
* 引數:
*  無

* 返回值:
*  無
*
* 說明:
*  停止聲音回放,釋放聲音回放聲備所佔用的資源。
  該函式是一個安全的函式,即使你沒有成功建立聲音回放裝置,你仍然可以(應該)呼叫該函式,以確保聲音回放裝置被釋放。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCreateNewObj()
*
* 型別:
*  靜態函式。
*
* 引數:
*  WPARAM  wParam  -訊息的wParam引數。
*  LPARAM  lParam  -訊息的lParam引數。

* 返回值:
*  無
*
* 說明:
*  在接收到OMSG_CREATE_NEW_OBJ訊息時,才需要呼叫該函式。該函式的2個引數就是訊息響應函式的2個引數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCreateNewThread()
*
* 型別:
*  靜態函式。
*
* 引數:
*  WPARAM  wParam  -訊息的wParam引數
*  LPARAM  lParam  -訊息的lParam引數

* 返回值:
*  無
*
* 說明:
*  在OMSG_CREATE_NEW_THREAD訊息的響應函式的最後,呼叫該方法。該函式的2個引數就是訊息響應函式的2個引數。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SCreateTCPListenPort()
*
* 型別:
*  靜態函式。
*
* 引數:
*  UINT  nPort  -埠的埠號
*
* 返回值:
*  bool  -如果成功的建立了監聽埠,則返回true。否則返回false。
*
* 說明:
*  建立一個TCP監聽埠。
  該函式只能被執行一次,超過一次的執行將不作任何操作,並始終返回true。

   後續版本的支援:  在後續的版本中,將允許建立多個監聽埠,在DLL內部會維護一個已經建立的監聽埠的列表。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SGetSelfUserID()
*
* 型別:
*  靜態函式。
*
* 引數:
*  CString*  pstrID  -儲存當前使用者ID的物件的指標。

* 返回值:
*  無
*
* 說明:
*  將當前使用者ID複製到傳遞的引數中。當前使用者的ID被儲存在PDefine::szSelfFriendID變數中。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SInitSocketStream()
*
* 型別:
*  靜態函式。
*
* 引數:
*  無

* 返回值:
*  bool  -如果初始化win socket庫成功,則返回true。
*
* 說明:
*  初始化win socket庫和內部的一些工作執行緒。在程式開始前必需先呼叫該方法。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SNotifyConnectSrc()
*
* 型別:
*  靜態函式。
*
* 引數:
*  PDHANDLE  handle  -解析該指令的PDHANDLE物件的控制程式碼。該控制程式碼可透過指令物件的GetCallBackPointer()方法得到。
*  DWORD  dwFlag  -希望SOCKET作出的動作。取值是列舉中定義的以ACT_打頭的常量。
*
* 返回值:
*  無
*
* 說明:
  自定義物件回撥傳送指令的Socket連線物件,指示Socket作出相應的動作。這個函式只有在自定義物件的處理函式中發現指令物件傳遞了錯誤的資訊,需要關閉連線時才需要呼叫。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SRemoveUserGetObjectFunHook()
*
* 型別:
*  靜態函式。
*
* 引數:
*  GOCALLBACK  pFun  -指向要取消的鉤子(回撥)函式的指標。
*
* 返回值:
*  無
*
* 說明:
*  摘除原先設定的返回開發者自定義物件的CRuntimeClass結構的指標的鉤子函式。
  如果鉤子函式原先沒有被設定,函式不執行任何操作。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 函式名稱:
*  SSetUserGetObjectFunHook()
*
* 型別:
*  靜態函式。
*
* 引數:
*  GOCALLBACK  pFun  -指向要增加的鉤子(回撥)函式的指標。
*
* 返回值:
*  無
*
* 說明:
*  設定返回開發者自定義物件的CRuntimeClass*指標的鉤子(回撥)函式。
  如果要增加的鉤子函式已經被加入了,將不再重複增加這個鉤子函式。
 
  注意:  每一個開發者都應該獨立的設定自己的鉤子函式來返回自定義物件的CRuntimeClass結構的指標。

  其他開發者透過呼叫SSetUserGetObjectFunHook()函式來增加你的鉤子函式。

 

十三 PDefine類中的靜態屬性

* 屬性定義:
*  bool  bSIsReleaseVer
*
* 型別:
*  靜態。預設值=true。
*
* 說明:
*  表明當前的執行程式是否是正式版本。
  如果該值為false,則可以進行單機的連線測試。
  在單機測試時,被連線方將返回一個固定的ID號"PPQ000000000"。
 
  如果你需要與其它程式相連,則必需設定該值為true。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  DWORD  dwSBlockMaxSize
*
* 型別:
*  靜態。預設值=5*1024*1024=5M bytes。
*
* 說明:
*  當接收一個檔案時,如果沒有指定分割塊的個數,DLL會按照該值來決定一個塊的最大尺寸。

*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  GETPALCALLBACK  pSGetFriendCallBackFun
*
* 型別:
*  靜態。這個屬性必需在開始時就賦於一個正確的回撥函式的地址。不能為NULL。
*
* 說明:
*  儲存回撥函式的指標,透過向這個函式傳遞好友的ID來得到該ID所對應的PFriend物件的指標。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  GETFILENCALLBACK  pSGetFileNCallBackFun
*
* 型別:
*  靜態。這個函必需在開始時就賦於一個正確的回撥函式的地址。不能為NULL。
*
* 說明:
*  儲存回撥函式的指標,透過向這個函式傳遞一個檔案的數字標識來得到實際的檔名。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  PMSGINFO  rSMsgInfo
*
* 型別:
*  靜態。這個屬性必需在開始時就賦於一個有效的值。
*
* 說明:
*  定義接收DLL傳送的一些重要訊息的接收窗體。這個結構必需被賦值。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  char  szSelfFriendID[USER_ID_LEN+1]
*
* 型別:
*  靜態。這個屬性必需在開始時就賦於一個有效的值。
*
* 說明:
*  自已的ID號。這個值在很多情況下都會被讀取,必需在DLL開始後首先賦值。
*
*
*  *  *  *  *  *  *  *  *  *  *  *  *
* 屬性定義:
*  WORD  wSendMsgRate;

*
* 型別:
*  靜態。預設值=100。
*
* 說明:
*  表示接收或傳送執行緒中向外傳送OMSG_RECV_DATA或OMSG_SEND_DATA訊息時的預設速率。
  值越大,傳送訊息次數越少,值越小,傳送訊息的次數越多。

   預設值的情況下,大約每接收或傳送到400K資料時,傳送一次訊息。

 


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

相關文章