JVM_UNSAFE_NATIVE_MEMCOPY

ネイティブ メモリを、Windows FormatMessage API などのサード パーティ API によって割り当てられた JVM メモリにコピーします。この JVM_UNSAFE_NATIVE_MEMCOPY ライブラリ ルーチン以外の方法で JVM メモリをアドレス指定することはできません。
警告: このライブラリ ルーチンを使用する際には、有効なパラメーターを渡すよう十分に注意してください。無効なパラメーターを渡すと環境が不安定になる可能性があります。

構文:

call “JVM_UNSAFE_NATIVE_MEMCOPY” using
   by value nativePointer
   by value memoryLength
   by value managedPointer
   returning status-code
end-call

パラメーター:

nativePointer
ネイティブ ポインター。
memoryLength
PIC S9(9) COMP-5 で表される長さ。
managedPointer
native-pointer が次のユーザー型定義であるポインター。
$IF JVM32 DEFINED  
01 native-pointer is typedef pic x(4) comp-5.
$ELSE
01 native-pointer is typedef pic x(8) comp-5.
$END

status-code
返される状態コード。

入力パラメーター:

nativePointer
ネイティブ メモリのアドレス。
memoryLength
ネイティブ メモリ ブロックの長さ。
managedPointer
JVM メモリ ブロックのアドレス。

出力パラメーター:

status-code
0 成功
1 無効な長さが指定された

例:

この例は、コンパイル済み JVM COBOL プログラムから FormatMessage API を使用する方法を示しています。
      $set ans85 mf defaultbyte"00" case
      $ if jvmgen set
      $ set remove"internal" remove"event"
      $end
       copy "windows.cpy".
 
       program-id. geterror.
       special-names.
          call-convention 74 is winapi.
       data division.
       working-storage section.
 
      $if jvmgen set
      $ if NOP64 set
        01 native-pointer     is typedef pic x(4) comp-5.
      $ else
        01 native-pointer     is typedef pic x(8) comp-5.
      $ end
      $else
        01 native-pointer     is typedef pointer.
      $end
 
       01 format-message-group.
        03 last-error                   DWORD.
        03 message-pointer              native-pointer.
        03 format-type                  DWORD.
        03 bytes-returned               DWORD.
        03 last-error-display           pic 9(2).
 
       local-storage section.
       01 ls-message-buffer                pic x(1024).
 
       linkage section.
       01 lnk-message-buffer               pic x(1024).
       procedure division.
      $if jvmgen set
           call "cob32api"
      $end
 
           display "First 20 system error messages"
 
           perform display-error varying last-error from 0 by 1
              until last-error = 20
 
           stop run.
 
       display-error.
           move 0 to format-type
           add FORMAT-MESSAGE-ALLOCATE-BUFFER to format-type
           add FORMAT-MESSAGE-FROM-SYSTEM to format-type
 
           call winapi FormatMessage
              using by value     format-type
                    by value     0 size 4       *> lpSource ignored
                    by value     last-error     *> error number
                    by value     0 size 4       *> LangID ignored
                    by reference message-pointer*> pointer to mess.
                    by value     0 size 4       *> min size of buffer
                    by value     0 size 4       *> arguments ignored
              returning bytes-returned
           end-call
 
           if bytes-returned > 0 and
                   bytes-returned < length of ls-message-buffer
 
      $if jvmgen set
      *> use the JVM memory instead of the native memory
              set address of lnk-message-buffer to
                      address of ls-message-buffer
      
      *> Copy the native memory to to the JVM memory
              call "JVM_UNSAFE_NATIVE_MEMCOPY" using
                 by value message-pointer
                 by value bytes-returned
                 by value address of ls-message-buffer
              end-call
      $else
              set address of lnk-message-buffer to message-pointer
      $end
              move last-error to last-error-display
              display " " last-error-display " =  "
                      lnk-message-buffer (1:bytes-returned - 2) *> remove x"ODOA"
 
              call winapi "LocalFree"
                using by value message-pointer
             end-call
 
           end-if.