2

学了很久python,终于有了一些突破:

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

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))

到目前为止一切都很好。它确实连接到终端,我可以使用其他功能将键发送到屏幕、断开连接等。

我的问题在于 IBM 文档定义的函数 5:

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 ref 中提到的那样预先分配字符串。材料?

我可以在复制屏幕后简单地添加一个“打印数据字符串”以查看信息,还是我需要使用一些 ctypes 才能查看复制的信息?

编辑:我忘了提到我不需要使用那个功能,我可以使用这个:

将表示空间复制到字符串 (8)

我尝试使用它,但 data_string 变量永远不会改变值。

EDIT2:按照 kwatford 的建议,我改变了行

data_string = c_char_p("")

data_string = create_string_buffer(8000)

现在该函数不会崩溃并返回值 0,表示:“'主机演示空间内容已复制到应用程序。目标演示空间处于活动状态,并且键盘已解锁。' 但是当我尝试打印变量 data_string 时,我仍然得到一个空的结果。

4

1 回答 1

2

您可以使用ctypes.create_string_buffer.

但是,您仍然需要知道缓冲区的大小。我不熟悉您尝试运行的软件,但听起来您需要:

  • 至少 25x80 Unicode 字符的空间
  • 这些字符的扩展属性可能有空间

所以作为一个粗略的猜测,我会说字符串应该至少有25*80*2*2 = 8000字节。

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

于 2012-08-01T16:48:27.260 回答