首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL -调用Windows API Getsysteminfo()

COBOL -调用Windows API Getsysteminfo()
EN

Stack Overflow用户
提问于 2018-05-23 22:35:19
回答 1查看 373关注 0票数 0

我正在调用windows API Getsysteminfo()来获取系统信息。但是,SYSTEM_INFO结构不会填充正确的信息。我认为主要的疑点是成员dwActiveProcessorMask,因为它可以编译为32位或64位平台。我将其定义为32位有符号整数。下面是COBOL代码:

代码语言:javascript
复制
identification division.
program-id. TEST.

Environment Division.
CONFIGURATION SECTION.

special-names.
     call-convention 74 is WinAPI.

working-storage section.
    01 DWORD           pic 9(9) comp-5 value 0 typedef.
    01 WORD            pic 9(5) comp-5 value 0 typedef.
    01 LPVOID          POINTER typedef.
    01 DWORD-PTR       POINTER typedef.

    01 SYSTEM-INFO.
       05  dwOemId                       DWORD.
       05  wProcessorArchitecture        WORD.
       05  wReserved                     WORD.
       05  dwPageSize                    DWORD.
       05  lpMinimumApplicationAddress   LPVOID.
       05  lpMaximumApplicationAddress   LPVOID.
       05  dwActiveProcessorMask         DWORD-PTR.
       05  dwNumberOfProcessors          DWORD.
       05  dwProcessorType               DWORD.
       05  dwAllocationGranularity       DWORD.
       05  wProcessorLevel               WORD.
       05  wProcessorRevision            WORD.

linkage section.
    01 LS-DWORD-PTR     DWORD.


procedure division WinApi.
100-MAIN SECTION 1.

         call winapi "GetSystemInfo" using
              by reference System-Info
         end-call

         set address of ls-dword-ptr to dwActiveProcessorMask

谢谢你的帮助。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(v=vs.85).aspx

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 20:12:19

我上一次做这样的事情已经有20年了;但我确实记得没有直接的方法在COBOL中‘取消引用’一个C pointer。这必须是间接的。

更改:

代码语言:javascript
复制
01 DWORD-PTR    pic s9(9) comp-5 value 0 typedef.

代码语言:javascript
复制
01 DWORD-PTR    POINTER typedef.

添加:

代码语言:javascript
复制
linkage section.
01 ls-dword DWORD.

call之后添加:

代码语言:javascript
复制
set address of ls-dword to dwActiveProcessorMask

set语句之后,ls-dword的内容将与dwActiveProcessorMask的内容相同。

(在2002年的标准中,添加了BASED子句来处理这些情况。)

这是SYSTEM_INFO的第一部分。

代码语言:javascript
复制
typedef struct _SYSTEM_INFO {
  union {
    DWORD  dwOemId;
    struct {
      WORD wProcessorArchitecture;
      WORD wReserved;
    };
  };
  DWORD     dwPageSize;

您将其定义为:

代码语言:javascript
复制
   05  dwOemId                       DWORD.
   05  wProcessorArchitecture        WORD.
   05  wReserved                     WORD.
   05  dwPageSize                    DWORD.

在COBOL语言中,C union变成了REDEFINES,即wProcessorArchitecturewReserveddwOemId占用相同的空间。由于dwOemId已过时,因此应将其删除。实际上,SYSTEM-INFO比它应有的长度长了4个字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50491129

复制
相关文章

相似问题

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