经过长时间的学习,我终于取得了一些突破:
我正在使用以下代码连接到个人通信终端:
from ctypes import *
import sys
PCSHLL32 = windll.PCSHLL32
hllapi = PCSHLL32.hllapi
def connect_pcomm(presentation_space):
function_number = c_int(1)
data_string = c_char_p(presentation_space)
lenght = c_int(4)
ps_position = c_int(0)
hllapi(byref(function_number), data_string, byref(lenght), byref(ps_position))
到目前为止一切都很好。它确实连接到终端,我可以使用其他功能向屏幕发送密钥,断开连接等
我的问题是函数5,正如IBM文档所定义的:
http://publib.boulder.ibm.com/infocenter/pcomhelp/v5r9/index.jsp?topic=/com.ibm.pcomm.doc/books/html/emulator_programming08.htm
"复制演示空间功能将主机连接的演示空间的内容复制到您在EHLLAPI应用程序中定义的数据字符串中。"
我为此写的代码(没有那么特别):
def copy_presentation_space():
function_number = c_int(5)
data_string = c_char_p("")
lenght = c_int(0)
ps_position = c_int(0)
hllapi(byref(function_number), data_string, byref(lenght), byref(ps_position))
主要问题是data_string var应该是:"预先分配的目标字符串,即主机表示空间的大小。"
由于我没有完全意识到这意味着什么,我只是试着运行代码。pythonw.exe崩溃了。史诗般的。航站楼的窗户也随之倒塌。它没有给出任何类型的错误,只是说它停止了工作。
现在,我的主要问题是,如何像IBM参考资料中提到的那样预分配字符串?
我可以在复制屏幕后简单地添加一个"打印数据字符串"来查看信息吗?或者我需要使用一些ctypes才能查看复制的信息吗?
编辑:我忘了提我不需要使用那个功能,我可以使用这个:
将演示空间复制到字符串(8)
我尝试使用它,但data_string变量从未更改值。
第2版:根据夸特福德的建议,我更改了线路
data_string = c_char_p("")
至
data_string = create_string_buffer(8000)
现在,该函数不会崩溃并返回值0,这意味着:"'主机演示空间内容已复制到应用程序。目标演示空间处于活动状态,键盘已解锁。'但当我尝试打印变量data_string时,我仍然得到一个空结果。
您可以使用ctypes.create_string_buffer
创建预先分配的字符串缓冲区。
然而,你仍然需要知道缓冲区有多大。我不熟悉你试图运行的软件,但听起来你需要:
- 至少可容纳25x80个Unicode字符的空间
- 可能为这些字符的扩展属性留出空间
因此,粗略地猜测,字符串应该至少有25*80*2*2 = 8000
字节。
如果不起作用,我建议更深入地阅读文档以确定正确的值。