Windows 的 CPI-C考量

本主題摘要說明當您根據 Windows 作業系統開發程式時,應該記住的資訊。

使用訊息張貼的非同步完成通知
非同步作業完成時,應用程式視窗 hwndNotify 會以 「WinAsyncCPIC」 作為輸入字串接收 RegisterWindowMessage 所傳回的訊息。 wParam值包含正在完成之作業的conversation_return_code。 其值取決於最初發出的作業。 IParam引數包含原始函式呼叫中指定的conversation_ID CM_PTR

使用 Win32®事件的非同步完成通知
當動詞在非封鎖交談上發出時,如果動詞會以非同步方式完成,則會傳回CM_OPERATION_INCOMPLETE。 如果事件已向交談註冊,應用程式可以呼叫 WaitForSingleObjectWaitForMultipleObjects ,以通知動詞完成。 WinCPICExtractEvent 允許 Common Programming Interface for Communications (CPI-C) 應用程式來判斷此事件控制碼。 動詞完成之後,應用程式必須呼叫 Wait_For_Conversation,以判斷非同步動詞的傳回碼。 您可以呼叫 Cancel_Conversation函式來取消作業和交談本身。

應用程式必須負責重設事件,因為它與其他 API 一樣。

如果尚未註冊任何事件,非同步動詞就會如目前一樣完成,其方式是將訊息張貼至應用程式向 CPI-C 程式庫註冊的視窗。

位元組排序
根據預設,會使用 Intel 位元組排序。 針對內嵌環境,定義NON_INTEL_BYTE_ORDER會針對常數執行所有必要的翻轉。 動詞控制區塊中的非常數輸入參數 (VCB) ,例如長度和指標一律是原生格式。

事件
若要以非同步方式接收資料,事件控制碼會傳入 VCB 的旗號欄位。 當傳遞至 CPI-C 時,此事件必須處於非簽署狀態,而且控制碼必須具有事件的EVENT_MODIFY_STATE存取權。

程式庫名稱
Win32® DLL 名稱 WINCPIC32.DLL。

多個執行緒
交易程式 (TP) 可以有多個發出動詞的執行緒。 Windows CPI-C 會針對多執行緒 Windows 程式進行布建。 進程包含一或多個執行的執行緒。 執行緒的所有參考都會參考多執行緒 Windows 環境中的實際執行緒。

打包
基於效能考慮,不會封裝 VCB。 因此,DWORD 位於 DWORD 界限、WORD 上的 WORD,以及 BYTU 上的 BYTE。 應該使用所提供的結構來存取 VCB。

執行時間連結
若要在執行時間動態連結至 CPI-C 的 TP,TP 必須發出:

  • LoadLibrary 可動態載入 WINCPIC 的程式庫 WINCPIC.DLL 或 WINCPIC32.DLL。

  • GetProcAddress 將 WINCPIC 指定為動態連結程式庫所需的進入點, (DLL) 。

  • 不再需要 CPI-C 程式庫時的FreeLibrary

    同時交談
    程式可以同時參與每個進程最多 64 個交談。

    終止應用程式
    在 Windows 作業系統中,CPI-C 無法分辨應用程式何時終止。 因此,如果應用程式必須關閉 (,它會因為使用者) 的 ALT+F4 而收到WM_CLOSE訊息,應用程式應該呼叫 WinCPICCleanup

    產生給其他元件
    處理 CPI-C 和 Common Service Verbs (CSV) 時,程式庫程式碼可能需要產生,才能讓另一個元件,例如 SnaBase 接收訊息,並將其傳遞至應用程式。 這可以使用 Windows 擴充功能 WinCPICSetBlockingHookWinCPICUnhookBlockingHook來完成。

    WinCPICSetBlockingHook 可讓 Windows CPI-C 實作透過新的函式來封鎖 CPI-C 函式呼叫。 若要呼叫 WinCPICSetBlockingHook

FARPROC WINAPI WinCPICSetBlockingHook (FARPROC 1pBlockFunc)  

WinCPICUnhookBlockingHook 會移除任何先前已安裝並重新安裝預設封鎖機制的封鎖攔截。 若要呼叫 WinCPICUnhookBlockingHook

BOOL WINAPI WinCPICUnhookBlockingHook (void)