WinAPI STARTUPINFO 64 位 (QB64)

如何解决WinAPI STARTUPINFO 64 位 (QB64)

我正在使用 qb64 编程,这是一种允许类似 QBASIC 的语法的编程语言,并被翻译成 C++ 代码并编译。

如果我们想在我们的代码中使用 struct,那么我们必须声明它并手动创建它。在 32 位中,没问题,因为它匹配 WinAPI MSDN 页面并且几乎总是可以工作。但是,对于 64 位,结构具有不同的字节打包,我无法找出 STARTUPINFO struct 的正确打包。

以下是我对 struct 的声明,因为它适用于 32 位。我知道 struct 需要 104 个字节,而我目前只有 8 个字节;我已确保所有变量都与 64 位大小匹配,但我在结构中的某处缺少 8 个字节的填充。知道字节打包和 WinAPI 结构的人能帮我解决这个问题吗?

Type STARTUPINFO
    cb As Long '4 bytes
    lpReserved As _Offset '4 bytes in 32,8 in 64
    lpDesktop As _Offset '4 bytes in 32,8 in 64
    lpTitle As _Offset '4 bytes in 32,8 in 64
    dwX As Long '4 bytes
    dwY As Long '4 bytes
    dwXSize As Long '4 bytes
    dwYSize As Long '4 bytes
    dwXCountChars As Long '4 bytes
    dwYCountChars As Long '4 bytes
    dwFillAttribute As Long '4 bytes
    dwFlags As Long '4 bytes
    wShowWindow As Integer '2 bytes
    cbReserved2 As Integer '2 bytes
    lpReserved2 As _Offset '4 bytes in 32,8 in 64
    hStdInput As _Offset '4 bytes in 32,8 in 64
    hStdOutput As _Offset '4 bytes in 32,8 in 64
    hStdError As _Offset '4 bytes in 32,8 in 64
End Type

解决方法

下面总结了 32 位和 64 位版本中 STARTUPINFOW 结构的字段大小和位置。 (请注意,对于用于非 Unicode 构建的结构的等效 STARTUPINFOA 版本,这些大小和偏移量是相同的。)

32 位 Windows(注意不需要填充——几乎可以肯定是设计使然):

typedef struct _STARTUPINFOW {
    DWORD   cb;             // 4 bytes ->  4 total
    LPWSTR  lpReserved;     // 4           8
    LPWSTR  lpDesktop;      // 4          12
    LPWSTR  lpTitle;        // 4          16
    DWORD   dwX;            // 4          20
    DWORD   dwY;            // 4          24
    DWORD   dwXSize;        // 4          28
    DWORD   dwYSize;        // 4          32
    DWORD   dwXCountChars;  // 4          36
    DWORD   dwYCountChars;  // 4          40
    DWORD   dwFillAttribute;// 4          44
    DWORD   dwFlags;        // 4          48
    WORD    wShowWindow;    // 2          50
    WORD    cbReserved2;    // 2          52
    LPBYTE  lpReserved2;    // 4          56
    HANDLE  hStdInput;      // 4          60
    HANDLE  hStdOutput;     // 4          64
    HANDLE  hStdError;      // 4          68 bytes total
};

64 位 Windows(现在需要填充,因为 8 字节指针应该是 8 字节对齐的):

typedef struct _STARTUPINFOW {
    DWORD   cb;             // 4 bytes ->  4 total
    // 4 b padding to align next pointer:  8
    LPWSTR  lpReserved;     // 8          16
    LPWSTR  lpDesktop;      // 8          24
    LPWSTR  lpTitle;        // 8          32
    DWORD   dwX;            // 4          36
    DWORD   dwY;            // 4          40
    DWORD   dwXSize;        // 4          44
    DWORD   dwYSize;        // 4          48
    DWORD   dwXCountChars;  // 4          52
    DWORD   dwYCountChars;  // 4          56
    DWORD   dwFillAttribute;// 4          60
    DWORD   dwFlags;        // 4          64
    WORD    wShowWindow;    // 2          66
    WORD    cbReserved2;    // 2          68
    // 4 b padding to align next pointer: 72
    LPBYTE  lpReserved2;    // 8          80
    HANDLE  hStdInput;      // 8          88
    HANDLE  hStdOutput;     // 8          96
    HANDLE  hStdError;      // 8          104
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?