首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >64位WinAPI STARTUPINFO (QB64)的字节打包

64位WinAPI STARTUPINFO (QB64)的字节打包
EN

Stack Overflow用户
提问于 2021-02-11 22:55:25
回答 1查看 98关注 0票数 1

我正在用QB64编程,这是一种支持类似QBASIC语法的编程语言,它被翻译成C++代码并进行编译。

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

下面是我的struct声明,因为它在32位中工作。我知道struct需要104个字节,而我现在少了8个字节;我已经确保所有变量都匹配64位大小,但是我的结构中缺少8个字节的填充。知道字节打包和WinAPI结构的人能帮我解决这个问题吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-11 23:29:26

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

32位Windows (请注意,不需要填充--几乎肯定是设计出来的):

代码语言:javascript
复制
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字节对齐的):

代码语言:javascript
复制
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
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66157098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档