ネイティブ メモリを、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 メモリ ブロックのアドレス。
例:
この例は、コンパイル済み 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.