学习的同时习练PowerBuilder对VB6 ActiveX exe公共对象的调用,初步感觉PowerBuilder调用DLL还是要求比较严格的,APP和powerbuilder本身都比较脆弱、易崩溃,因此,
1. 直接调用外部DLL时,传递地址参数,尽量不传递字符串;
2. 从DLL返回时,尽量不回写传送的地址,而用export返回结果;
3. 用ActiveX exe非常安全,因为 Activex exe本身是外部运行的程序。
在链接的《VB6创建ActiveX exe简单方法》
VB6创建ActiveX exe简单方法_Mongnewer的博客-CSDN博客
中习练过Activex exe的创建,总结起来是在工程中模板中把自己要做的事情封装在CLASS中,然后加个模块,写个sub main() 过程即可。技巧是在 sub main()中读取命令行参数,避免直接点击误装入,另外是调用程序退出时清除掉这个进程。Activex EXE只做个简短回顾,下面是在powerbuilder中调用它的实践。
程序的 Direct PBasic DLL是首次学习时对PowerBasic写的DLL的直接调用,VB6 ActivexEXE 是对 Activex EXE 公共对象的调用。
1. 首先在 Global 中定义对象和需要的变量
OLEObject MBFObj
Integer li_rc
2. 接下来在主窗体 open 时装入 activex EXE, 然后创建 OLEObject,将其 ConnectToNewObject 连接到 activex EXE中的那个唯一的类, 文件名.类名
Byte hExternCOM = 0
hExternCOM = Run("MBFMODIEEE.exe !@#$*&^%12348765", Minimized!)
IF hExternCOM = 1 THEN //COM is succesfully loaded.
MBFObj = CREATE OLEObject
li_rc = MBFObj.ConnectToNewObject("MBFMODIEEE.MBFIEEECRC")
IF li_rc < 0 THEN
DESTROY MBFObj
MessageBox("Connecting to COM Object Failed", &
"Error: " + String(li_rc))
Return
END IF
END IF
3. 在主窗体的 “VB6 ActivexEXE” 钮的click事件中加入调用代码,完成调用功能。
sle_6.text = MBFobj.ModbusRoutines(10, "VERSION")
sle_7.text = MBFobj.ModbusRoutines(10, "AUTHOR")
sle_2.text = MBFobj.ModbusRoutines(1, sle_1.text)
sle_8.text = MBFobj.ModbusRoutines(5, sle_2.text)
sle_3.text = MBFobj.ModbusRoutines(2, sle_1.text)
sle_9.text = MBFobj.ModbusRoutines(6, sle_3.text)
sle_4.text = MBFobj.ModbusRoutines(3, sle_1.text)
sle_10.text = MBFobj.ModbusRoutines(7, sle_4.text)
sle_5.text = MBFobj.ModbusRoutines(4, sle_1.text)
sle_11.text = MBFobj.ModbusRoutines(8, sle_5.text)
sle_13.text = MBFobj.ModbusRoutines(9, sle_12.text)
4. 在主窗体关闭时 DESTROY MBFObj ,将创建的MBFObj销毁。
程序运行时在任务管理器中观察不到MBFMODIEEE进程,它被封闭在了 SAP AG Product File 进行之中,当退出PowerBuilder应用程序时,SAP AG 的全部支持进程自动销毁,不需单独对用户进程做处理。