Copies native memory to managed memory allocated by third-party APIs, such as the Windows FormatMessage API. You cannot address managed memory except with this JVM_UNSAFE_NATIVE_MEMCOPY library routine.
Warning: When using this library routine, take great care to pass valid parameters. An invalid parameter can cause instability in your environment.
Syntax:
call “JVM_UNSAFE_NATIVE_MEMCOPY” using
by value nativePointer
by value memoryLength
by value managedPointer
returning status-code
end-call
Parameters:
-
nativePointer
- A native-pointer.
- memoryLength
- The length expressed as PIC S9(9) COMP-5.
- managedPointer
- A pointer where
native-pointer is the user typedef:
$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
- The returned status code.
On Entry:
- nativePointer
- The address if the native memory.
- memoryLength
- The length of the native memory block.
- managedPointer
- The address of the managed memory block.
On Exit:
- status-code
-
0
|
success
|
1
|
a bad length has been given
|
Example:
This example demonstrates how the FormatMessage API can be used from a JVM compiled COBOL program.
$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 managed 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 managed 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.