COBOL - Вызов Windows API Getsysteminfo () - PullRequest
0 голосов
/ 23 мая 2018

Я звоню в 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

1 Ответ

0 голосов
/ 24 мая 2018

Прошло около 20 лет с тех пор, как я делал такие вещи;но я помню, что не существует прямого способа «отменить ссылку» на C pointer в COBOL.Это должно быть сделано косвенно.

Изменить:

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 байта длиннее, чем должно быть.

...