pbm_custom01 - pbm_custom75 2009-12-08 17:22:12
分类:
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 不可与其他执行档相同, 否则会造成误判的状况.