C/C++ code 如何呼叫其他 PB 執行檔中的 Event 常常有人問到 PowerBuilder 的執行檔 (.exe), 在執行的過程中能不能相互呼叫.
當一個使用者在同一台機器中執行人事系統及業務員系統時, 其中業務員系統中的員工資料, 是從人事系統的資料庫來的, 所以當人事系統的員工資料異動後, 希望業務員系統中的員工相關資料可以同步處理.
在不同的 PowerBuilder 應用系統間, 只要預先設定好相互溝通的協定, 的確是可以做到這樣的效果.
A. 被呼叫的 PB 執行檔要做的處理:
1. 假設有一個執行檔 pb1.exe 是 MDI 的應用系統, MDI Frame 命名為 w_frame_1, pb1.exe 是要被其他 PB 執行檔呼叫用的, Title 的內容是提供其他系統辨識 pb1.exe 是否正在執行使用的. w_frame_1.Title = "Application One"
2. 在 w_frame_1 建立新的 user event 命名為 ue_1 (任何名稱都可以), 最重要的是 Event ID 請選擇 pbm_custom01 (可以選擇的是 pbm_custom01 - pbm_custom75) 3. 當 pb1.exe 被呼叫時要處理的程式碼寫在 ue_1 event 中
B. 在其他 PB 執行檔呼叫 pb1.exe 的程式處理
1. 建立 External Function FUNCTION long FindWindowA( ulong Winhandle, string WinTitle ) Library "user32"
2. 取得 pb1.exe 的 handle, handle > 0 表示 pb1.exe 正在執行中 long ll_hdl ll_hdl = FindWindowA(0, "Application One")
3. 呼叫 pb1.exe 中 w_frame_1 的 ue_1 event, Send() 的第二個參數, 是跟 Event ID 相互搭配的, 其中 pbm_custom01 對應 1024, pbm_custom02 對應 1025, 依此類推直到 pbm_custom75 對應 1098. IF ll_hdl > 0 THEN // 判斷 pb1.exe 是否正在執行 Send(ll_hdl, 1024, 0, 0) // 呼叫 pb1.exe 的 w_frame_1 的 ue_1 event (pbm_custom01) END IF
4. 呼叫時可使用 Send() 以 trigger 的方式處理, 或 Post() 以 post 的方式處理.
C. 注意事項
1. 建議呼叫 MDI Frame 的 user event, 再由被呼叫的 user event 實際去執行該應用系統中其他的相關程式.
2. 將 Event ID (pbm_custom01 - pbm_custom75) 做適當的分配, 提供不同的應用系統間整合處理, 例如: pbm_custom01 為人事系統使用, pbm_custom02 為業務員系統使用, ...
3. 參數傳遞, Send() or Post() 的第三、第四個參數分別可以傳送 unsignedlong、long 的值, 在被呼叫的 user event 中是以 wparam、lparam 的兩個參數接收. 當然這在 Windows SDK 下有真正的定義, 有興趣的人可自行參閱相關資料.
4. Event ID pbm_custom01 - pbm_custom75 從 PowerBuilder 6.0 起已被列入 Obsolete technique, 還繼續保留的原因是為了往前相容, 未來應該是可以繼續使用的.
5. Window Title 不可與其他執行檔相同, 否則會造成誤判的狀況.
阅读(3368) | 评论(0) | 转发(0) |