【问题标题】:Python, ctypes, DLLs and PCOMM emulation. How can I pre-allocate a variable?Python、ctypes、DLL 和 PCOMM 仿真。如何预先分配变量?
【发布时间】:2012-08-01 16:15:36
【问题描述】:

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

我可以在复制屏幕后简单地添加一个'print data_string'来查看信息,还是我需要使用一些ctypes才能查看复制的信息?

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

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

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

编辑2: 按照 kwatford 的建议,我改了行

data_string = c_char_p("")

data_string = create_string_buffer(8000)

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

【问题讨论】:

    标签: python dll ctypes emulation


    【解决方案1】:

    您可以使用ctypes.create_string_buffer 创建一个预分配的字符串缓冲区。

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

    • 至少 25x80 个 Unicode 字符的空格
    • 可能为这些字符的扩展属性留出空间

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

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

    【讨论】:

    • 这是有道理的。我在 Visual Basic 中使用的原始代码有一个使用“字符串 * 8000”的变量声明。我更新了原始问题只是为了检查您是否可以帮助解决已经出现的第二个问题。应该包含屏幕捕获信息的变量是空白的。实际上,当我打印它时,我得到了信息:。我想我应该阅读 ctypes 文档来检查问题所在。无论如何,谢谢!
    • @JohnnyBigoode 该字符串缓冲区对象具有您可以检查以获取实际数据的属性。一个叫value,另一个叫raw。由于此处可能存在扩展属性数据,将其解释为字符串可能无法正常工作,因此我建议使用raw 属性。然后,您可以从中提取属性和 unicode 字符(这需要再次查看库文档以确定格式)。
    • 我使用了 'value' 方法,似乎还可以。在采取明确行动之前,我会先调查一下“原始”。
    猜你喜欢
    • 2021-11-20
    • 2013-02-16
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多