我正在调用windows API Getsysteminfo()来获取系统信息。但是,SYSTEM_INFO结构不会填充正确的信息。我认为主要的疑点是成员dwActiveProcessorMask,因为它可以编译为32位或64位平台。我将其定义为32位有符号整数。下面是COBOL代码:
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
发布于 2018-05-24 20:12:19
我上一次做这样的事情已经有20年了;但我确实记得没有直接的方法在COBOL中‘取消引用’一个C pointer。这必须是间接的。
更改:
01 DWORD-PTR pic s9(9) comp-5 value 0 typedef.至
01 DWORD-PTR POINTER typedef.添加:
linkage section.
01 ls-dword DWORD.在call之后添加:
set address of ls-dword to dwActiveProcessorMask在set语句之后,ls-dword的内容将与dwActiveProcessorMask的内容相同。
(在2002年的标准中,添加了BASED子句来处理这些情况。)
这是SYSTEM_INFO的第一部分。
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
};
};
DWORD dwPageSize;您将其定义为:
05 dwOemId DWORD.
05 wProcessorArchitecture WORD.
05 wReserved WORD.
05 dwPageSize DWORD.在COBOL语言中,C union变成了REDEFINES,即wProcessorArchitecture和wReserved与dwOemId占用相同的空间。由于dwOemId已过时,因此应将其删除。实际上,SYSTEM-INFO比它应有的长度长了4个字节。
https://stackoverflow.com/questions/50491129
复制相似问题