Allocating physical memory for Unsigned Integer in Visual Basic .NET? - vb.net

For example,
For integer, we allocate some memory and get its address:
Dim MyPointer As IntPtr = Marshal.AllocHGlobal(4)
Marshal.WriteInt32(MyPointer, 255)
For String,
Dim MyStrPointer As IntPtr = Marshal.StringToHGlobalAuto("Hello World")
Similary, I want to allocate memory for an Unsigned Integer (UInt32)

Unsigned integers like other .Net numeric types are structures and as such can be marshaled using Marshal.StructureToPtr and Marshal.PtrToStructure.
Dim origUI32 As UInt32 = UInt32.MaxValue
Dim MyPointer As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(origUI32))
Marshal.StructureToPtr(origUI32, MyPointer, True)
Dim retrievedUI32 As UInt32 = DirectCast(Marshal.PtrToStructure(MyPointer, GetType(UInt32)), UInt32)
Marshal.FreeHGlobal(MyPointer)
Debug.Assert(retrievedUI32 = origUI32)

Related

How do I combine 2 32-bit Unsigned Integers to 64-bit integer

Lets say I got 2 unsigned integer
first with value &H0D345B40
second with value &H9AF34A32
How do I produce a unsigned 64 bit integer with the value
&H324AF39A405B340D
Here is what I tried
dim crypt1 as uint32 = &H0D345B40
dim crypt2 as uint32 = &H9AF34A32
Dim output As UInt64 = (CType(CType(crypt1, UInt64), Long) Or (crypt2 << 32))
the output is &H000000009FF75B72
Solved it a crappy way but not bad anyways
dim output() as uint64
Dim bytes() As UInteger = {crypt1, crypt2}
Buffer.BlockCopy(bytes, 0, output, 0, 8)

Checking the return code from an application executed

I want to be able to check the return code from an application that is executed.
I tried implement it by the PowerBuilder function Run, but its not return the code of application which executed.
Thanks.
In fact, Run() launches the target synchronously, so by the time the next line of PowerScript runs, your Run() app may not be finished, let alone have a return code available. You need to make the Windows API calls with appropriate parameters yourself to achieve this, instead of relying on the PowerScript wrapper, which only gives you the synchronous option.
The following is what I have to launch a DOS command and get the return value. You may or may not need to tweak the parameters to the API calls as appropriate. The API calls are assuming a Unicode version of PowerBuilder, i.e. 10.0 or later.
External Function Prototypes
FUNCTION boolean CreateProcess(string AppName, string CommLine, long l1, long l2, boolean binh, long creationflags, long l3, string dir, str_startupinfo startupinfo, ref str_processinformation pi ) library 'kernel32.dll' alias for "CreateProcessW"
FUNCTION long WaitForSingleObject ( ulong ul_Notification, long lmillisecs ) library "kernel32.dll"
FUNCTION long GetExitCodeProcess(ulong hProcess,ref ulong lpExitCode) LIBRARY "kernel32.dll"
FUNCTION boolean CloseHandle(ulong h) library 'kernel32.dll'
ObjectStructure str_startupinfo
ulong cb
string lpreserved
string lpdesktop
string lptitle
ulong dwx
ulong dwy
ulong dwxsize
ulong dwysize
ulong dwxcountchars
ulong dwycountchars
ulong dwfillattribute
ulong dwflags
uint wshowwindow
uint cbreserved2
string lpreserved2
uint hstdinput
uint hstdoutput
uint hstderror
ObjectStructure str_processinformation
unsignedlong hprocess
unsignedlong hthread
long dwprocessid
long dwthreadid
function of_runandwait (string as_command, boolean ab_Visible) returns ulong
constant long STARTF_USESHOWWINDOW = 1
constant long CREATE_NEW_CONSOLE = 16
constant long NORMAL_PRIORITY_CLASS = 32
constant long INFINITE = -1
boolean lb_Return
long ll_Null, ll_CreationFlags, ll_Return
ulong lul_ProcessReturn
string ls_CurDir, ls_Null
str_StartupInfo lstr_Start
str_Processinformation lstr_PI
SetNull(ll_Null)
SetNull(ls_Null)
SetNull(ls_CurDir)
lstr_Start.cb = 72
lstr_Start.dwFlags = STARTF_USESHOWWINDOW
IF ab_Visible THEN
lstr_Start.wShowWindow = 1
ELSE
lstr_Start.wShowWindow = 0
END IF
ll_CreationFlags = CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS
lb_Return = CreateProcess (ls_Null, as_Command, ll_Null, ll_Null, FALSE, ll_CreationFlags, ll_Null, ls_CurDir, lstr_Start, lstr_PI)
ll_Return = WaitForSingleObject (lstr_PI.hProcess, INFINITE)
ll_Return = GetExitCodeProcess (lstr_PI.hProcess, lul_ProcessReturn)
CloseHandle(lstr_PI.hProcess)
CloseHandle(lstr_PI.hThread)
RETURN lul_ProcessReturn
Good luck,
Terry.
OleObject wsh
integer li_rc
CONSTANT integer MAXIMIZED = 3
CONSTANT integer MINIMIZED = 2
CONSTANT integer NORMAL = 1
CONSTANT boolean WAIT = TRUE
CONSTANT boolean NOWAIT = FALSE
wsh = CREATE OleObject
li_rc = wsh.ConnectToNewObject( "WScript.Shell" )
li_rc = wsh.Run("Notepad" , NORMAL, WAIT)
messagebox("hello", "world")
The third parameter WAIT runs the executable and waits for the completion and li_rc will receive the exit code.

bit pack Int16 into a Ushort VB.net

I have to pack and unpack a 16bit Int from/into a Ushort in VB.net
This is how I thought I could do it (doesn't work, gives me overflow exception)
'Pack Int16 into ushort '
Dim usPacked = CType(Data, UShort)
'unpack Int16 from ushort '
Dim unpacked = CType(data,Int16)
Thanks!
You can use the old Union solution
<StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Structure s1
<FieldOffset(0)> Public AsShort As Short
<FieldOffset(0)> Public AsUShort As UShort
End Structure
Dim v1 = GetTheShortValue()
Dim v2 = new s1
v2.AsShort = v1
Dim v3 As UShort = v2.AsUShort
EDIT: Jared's answer is better than this one of mine :(
UShort can store integers from 0 through 65,535.
Short can store integers from -32,768 through 32,767.
Long can store integers from about -2 billion to +2 billion.
You'll get an overflow when you try to put negative numbers into a UShort, or when you try to put numbers over 32,767 into a Short. One solution is to use a Long as an intermediary.
'Pack Int16 into ushort '
Dim usPacked = CType(CLng(nData) + 32768, UShort)
'unpack Int16 from ushort '
Dim unpacked = CType(CLng(usPacked) - 32768, Int16)

Powerbuilder WebCam

I am using EZTWAIN from a powerbuilder application to acquire images from an HP scanner. Recently I tried a Kodak model (i1120) and it seems that it is not supported. Specifically the application freezes during the scanning process (perhaps the problem has to do with duplex scanning).
Can you recommend another library that you have used and works ok for you, and provides an easy-to-use wrapper for the TWAIN API that can be used from Powerbuilder?
Check out this company: http://www.data-tech.com/ we use their ImageMan ActiveX suite with PB 10.5 and it works without a problem.
I had a similar problem with duplex scanning with several libraries. The solution is to use the scanner's interface directly when using duplex scanning instead of the ActiveX component. Most of the libraries have an option that can be enabled on the fly to use the scanner interface.
I currently use the Viscomsoft Scanner Pro ActiveX library.
**object : n_webcam**
================================================================================
forward
global type nvo_webcam from nonvisualobject
end type
end forward
global type nvo_webcam from nonvisualobject autoinstantiate
end type
prototype type
function ulong capCreateCaptureWindowA ( string lpszWindowName, ulong dwStyle, long li_x, long li_y, long nWidth, long nHeight, ulong ParentWin, long nId) LIBRARY 'AVICAP32.DLL' alias for "capCreateCaptureWindowA; ansi"
Function ulong GetDC ( ulong hWnd) Library "user32.dll"
Function long ReleaseDC ( ulong hWnd, ulong hdcr) Library "USER32.DLL"
Function ulong CreateCompatibleDC ( ulong hdc) Library "gdi32.dll"
Function ulong CreateCompatibleBitmap ( ulong hdc, ulong nWidth, ulong nHeight) Library "gdi32.dll"
Function boolean DeleteDC ( ulong hDC) Library "Gdi32.dll"
Function boolean BitBlt ( ulong hdcDest, long nXDest, long nYDest, long nWidth, long nHeight, ulong hdcSrc, long nXSrc, long nYSrc, long dwRop) Library "gdi32.dll"
Function boolean StretchBlt ( ulong hdcDest, long nXOriginDest, long nYOriginDest, long nWidthDest, long nHeightDest, ulong hdcSrc, long nXOriginSrc, longnYOriginSrc, long nWidthSrc, long nHeightSrc, long dwRop) Library "gdi32.dll"
Function ulong SelectObject ( ulong hdc, ulong HGDIOBJ) Library "gdi32.dll"
Function along GetDIBits ( ulong hdc, ulong hbmp, uint uStartScan, uint cScanLines, Ref blob lpvBits, Ref BITMAPINFO lpbi, uint uUsage) Library "gdi32.dll" alias for "GetDIBits"
Function long GetDIBits ( ulong hdc, ulong hbmp, uint uStartScan , uint cScanLines, ulong lpvBits, ref bitmapinfo lpbi, uint uUsage) Library "gdi32.dll" alias for "GetDIBits"
Subroutine CopyBitmapFileHeader ( Blob Ref Destination, bitmapfileheader Source, long Length) Library "kernel32.dll" Alias For "RtlMoveMemory" Subroutine CopyBitmapInfo ( Blob Ref Destination, Source bitmapinfo, long Length) Library "kernel32.dll" Alias For "RtlMoveMemory"
Function boolean OpenClipboard ( ulong hWndNewOwner) Library "user32.dll"
Function boolean CloseClipboard () Library "user32.dll"
Function boolean EmptyClipboard () Library "user32.dll"
Function ulong GetClipboardData ( ulong uFormat) Library "user32.dll"
end prototypes
such variables
Uint LHand
Constant long GET_FRAME = 1084
Constant long COPY = 1054
Constant long WM_USER = 1024
Constant long WM_CAP_START = WM_USER
Constant long WM_CAP_STOP = WM_CAP_START + 68
Constant long WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Constant long WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Constant long WM_CAP_SAVEDIB = WM_CAP_START + 25
Constant Long WM_CAP_GRAB_FRAME = WM_CAP_START + 60
Constant LongWM_CAP_SEQUENCE = WM_CAP_START + 62
Constant long WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
Constant long WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
Constant long WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63
Constant long WM_CAP_SET_OVERLAY = WM_CAP_START + 51
Constant long WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Constant long WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
Constant long WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2
Constant Long WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START +3
Long Constant WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START +5
Long Constant WM_CAP_SET_SCALE = WM_CAP_START + 53
Long Constant WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
end variables
forward prototypes
public subroutine of_close ()
public subroutine of_initialize_webcam ( unsignedlong a_handle, string a_title, integer a_width, integer a_height)
public function blob of_copy_clipboard_to_blob ()
public subroutine of_capture_pic ()
end prototypes
public subroutine of_close (); send (lhand, WM_CAP_DRIVER_DISCONNECT, 0, 0)
end subroutine
public subroutine of_initialize_webcam ( unsigned long a_handle, string a_title, integer a_width, integer a_height); string lpszName
lpszName = a_title
if lhand = 0 then
lhand = capCreateCaptureWindowA (lpszName, 262144 + 12582912 + 1073741824 + 268435456, 1.40, a_width, a_height, a_handle, 0)
end if
if lhand <> 0 then
send (lhand, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
send (lhand, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
send (lhand, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
send (lhand, WM_CAP_DRIVER_CONNECT, 0, 0)
send (lhand, WM_CAP_SET_SCALE, 1, 0)
send (lhand, WM_CAP_SET_PREVIEWRATE, 66, 0)
send (lhand, WM_CAP_SET_OVERLAY, 1, 0)
send (lhand, WM_CAP_SET_PREVIEW, 1, 0)
end if
end subroutine
public function blob of_copy_clipboard_to_blob (); BitmapInfo lstr_Info
BitmapFileHeader lstr_Header
Blob lblb_header, lblb_info, lblb_bitmap, lbl_final
ULong lul_hdc, lul_hdcMem, lul_hBitmap, lul_hWnd, lul_blpos
UInt DIB_RGB_COLORS
Integer li_pixels
Boolean lb_result
long al_width, ll_height, ll_ret
constant integer BITMAPTYPE = 19778 // 4D42 = BM
constant integer CF_BITMAP = 2
constant integer CF_DIB = 8
lul_hWnd = Handle ( this )
lb_result = OpenClipboard (lul_hWnd)
// Get the device context and allocate memory
lul_hdc = GetDC (lul_hWnd)
lul_hdcMem = CreateCompatibleDC (lul_hdc)
lul_hBitmap = getclipboarddata (CF_BITMAP)
// try to store the bitmap into a blob so we can save it
lstr_Info.bmiHeader.biSize = 40
ll_height = 480 // ... 480 should be enough for everyone? ;)
DIB_RGB_COLORS = 0
// Get the bitmapinfo
If GetDIBits (lul_hdcMem, lul_hBitmap, 0, ll_height, 0, lstr_Info, DIB_RGB_COLORS)> 0 Then
li_pixels = lstr_Info.bmiHeader.biBitCount
lstr_Info.bmiColors [li_pixels] = 0
lblb_bitmap = Blob (Space (lstr_Info.bmiHeader.biSizeImage), EncodingANSI!)
ll_height = lstr_Info.bmiHeader.biheight
// get the actual bits
ll_ret = GetDIBits (lul_hdcMem, lul_hBitmap, 0, ll_height, lblb_bitmap, lstr_Info, DIB_RGB_COLORS)
// ls_msg = hexdump_blob (lblb_bitmap, false)
// create a bitmap header
lstr_Header.bfType = BITMAPTYPE
lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage
lstr_Header.bfOffBits = 54 + (li_pixels * 4)
// copy the header structure to a blob
lblb_header = Blob (Space (7)) //
14/2 CopyBitmapFileHeader (lblb_header, lstr_Header, 14)
// copy the info structure to a blob
lblb_Info = Blob (Space (40 + li_pixels * 4) / 2))
CopyBitmapInfo (lblb_Info, lstr_Info, len (lblb_Info))
// add all together and we have a window bitmap in a blob
lbl_final = lblb_header + lblb_info + lblb_bitmap
End If
CloseClipboard ()
ReleaseDC (lul_hwnd, lul_hdc)
DeleteDC (lul_hdcMem)
return lbl_final
end function
public subroutine of_capture_pic (); Send (lhand, GET_FRAME, 0, 0)
Send (lhand, COPY, 0, 0)
end subroutine
we have nvo_webcam. create
call super :: create
TriggerEvent ( this , "constructor" )
end on
we have nvo_webcam. destroy
TriggerEvent ( this , "destructor" )
call super :: destroy
end on
**instantiate the object and initialize it:**
================================================================================
n_webcam.of_initialize_webcam (handle ( this ), "Webcam" , il_width, il_height)
**capture:**
================================================================================
n_webcam.of_capture_pic ()
**image processing:**
================================================================================
lb_blob = n_webcam..of_copy_clipboard_to_blob ()
// reinitialize for the webcam to continue live
i_nvo_webcam.of_initialize_webcam (handle ( this ), "Webcam" , il_width, il_height)
**Close:**
================================================================================
n_webcam.of_close ()
Watch Video https://youtu.be/ojcJs1ajWRc

UInt32 to Int32

If I have a VB.Net function that returns an Int32, but uses an unsigned int (UInt32) for calculations, etc. How can I convert a variable "MyUintVar32" with a value of say "3392918397 into a standard Int32 in VB.Net?
In c# if I just do a "return (int)(MyUintVar32);", I get -902048899, not an error.
I've tried several different methods. What is the difference in the way c# handles these conversions versus VB.Net?
I realize this is an old post, but the question has not been answered. Other people my want to know:
Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = Convert.ToInt32(myUInt32.ToString("X"), 16)
the reverse operation:
myUInt32 = Convert.ToUInt32(myInt32.ToString("X"), 16)
Also, one can create a union structure to easily convert between Int32 and UInt32:
Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Explicit)> _
Public Structure UnionInt32
<FieldOffset(0)> _
Public IntValue As Int32
<FieldOffset(0)> _
Public UIntValue As UInt32
End Structure
Dim MyUnionInt32 as UnionInt32
MyUnionInt32.UIntValue = 3392918397
Dim IntVal as Int32 = MyUnionInt32.UIntValue '= -902048899
the reverse operation:
MyUnionInt32.IntValue = -902048000
Dim UIntVal as UInt32 = MyUnionInt32.UIntValue '= 3392919296
Cheers, TENware
3392918397 is too big to fit into a signed 32-bit integer, that's why it is coming out negative, because the most significant bit of 3392918397 is set.
1100 1010 0011 1011 1101 0011 0111 1101
If you want to maintain integers of this proportion inside a signed integer type, you'll need to use the next size up, a 64-bit signed integer.
It's not an optimal solution, but you can use BitConverter to get a byte array from the uint and convert the byte array to int.
Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = BitConverter.ToInt32(BitConverter.GetBytes(myUInt32), 0)
You can't convert 3392918397 into an Int32 since that number is too large to fit in 31 bits. Why not just change the function to return a UInt32?
Or after doing the Uint32 work check it against MAXINT and 0.
If > MAXINT and < 0 then you're ok. If not you "overflowed" and should throw an exception.
I don't remember if MAXINT is defined. You can use: 2^31 - 1 instead.