Python内存缓冲区pywin32

时间:2018-11-07 02:03:52

标签: python buffer pywin32

我有一些代码:

    def get_text(self, id):
        edit_hwnd = win32gui.GetDlgItem(self.hwnd, id)  # 获取窗口句柄
        time.sleep(0.2)
        self.edit_hwnd = edit_hwnd
        length = win32api.SendMessage(
             edit_hwnd, win32con.WM_GETTEXTLENGTH) + 1  # 获取窗体内容长度
        buf = win32gui.PyMakeBuffer(length)  # 准备buffer对象作为容器
        win32gui.SendMessage(edit_hwnd, win32con.WM_GETTEXT,
                         length, buf)  # 获取窗体内容放入容器
        try:
            address, length = win32gui.PyGetBufferAddressAndLen(buf)  # 获取容器的内存地址
        except ValueError:
            print('error')
            return
        text = win32gui.PyGetString(address, length)  # 取得字符串
        buf.release()
        del buf
        return text

此函数用于在Windows上获取字符串。我需要在此func中始终获取此值。当值更改时,我会执行某些操作。但是现在当我执行此操作时,我的程序将退出,错误代码为C000005。我解决了。

buf.release()
del buf

当我发现此问题时添加了它。它似乎不起作用。

1 个答案:

答案 0 :(得分:1)

消息WM_GETTEXTLENGTH返回以字符表示的文本长度(不包括终止空字符)和给{{3}的最大缓冲区长度}也是基于字符(包括的终止空字符)。

基于NT的Windows系统中的字符被编码为双字节字符集(DBCS),即每个字符两个字节。

函数win32gui.PyMakeBuffer(length)返回length字节的缓冲区。

因此,如果lengthWM_GETTEXTLENGTH的返回值,则保留缓冲区的长度应为length * 2 + 2个字节,而赋予WM_GETTEXT的最大缓冲区长度应为{{1 }}。