Python、ctypes、DLL和PCOMM仿真.如何预分配变量



经过长时间的学习,我终于取得了一些突破:

我正在使用以下代码连接到个人通信终端:

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字节。

如果不起作用,我建议更深入地阅读文档以确定正确的值。

最新更新