VisualBasicとDLLに実装されたアンマネージド関数との間で、構造体データの受け渡しを試して見ようと、GetSystemInfo関数を呼び出すだけのサンプルを作ってみました(GetNativeSystemInfo関数も同様)。
マイクロソフトのドキュメントによれば、SYSTEM_INFOの構文は、
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;
なので、構造体メンバーの変数型を UShort と UInteger に置き換えれば、上手くゆく筈?
★それにしても、凡そ20年前の WindowsXP と ペンティアム4、現役バリバリで良く頑張っているなぁ。
<注意点>
・Win32 ではC/C++のポインタサイズは4バイト、ポインタ精度変数のサイズも4バイト。つまり、Integer 型です。
・DWORD_PTR は Win32/Win64 でサイズが変化する事に留意。LPVOID は IntPtr の方が好ましい?
・Visual Basic のデフォルトの文字セットは、UNICODE です。
お試し環境
WindowsXP 32bit Edition
Visual Basic 2008
/*-------------------------------- お試し結果 ------------------------------*/
・GetSystemInfo 関数の取得データ
・GetNativeSystemInfo 関数の取得データ
/*----------------------------------------------------------------------------*/
/*-------------------------------- お試しソース ----------------------------*/
Imports System.Runtime.InteropServices
Public Class Form1
Const PROCESSOR_ARCHITECTURE_INTEL As Integer = 0 ' x86
Const PROCESSOR_ARCHITECTURE_ARM As Integer = 5 ' ARM
Const PROCESSOR_ARCHITECTURE_IA64 As Integer = 6 ' Intel Itanium-based
Const PROCESSOR_ARCHITECTURE_AMD64 As Integer = 9 ' x64(AMD or Intel)
Const PROCESSOR_ARCHITECTURE_ARM64 As Integer = 12 ' ARM64
Const PROCESSOR_ARCHITECTURE_UNKNOWN As Integer = &HFFFF ' Unknown architecture
Const PROCESSOR_INTEL_386 As Integer = 386
Const PROCESSOR_INTEL_486 As Integer = 486
Const PROCESSOR_INTEL_PENTIUM As Integer = 586
Const PROCESSOR_INTEL_IA64 As Integer = 2200
Const PROCESSOR_AMD_X8664 As Integer = 8664
' Const PROCESSOR_ARM As Integer = Reserved
Structure SYSTEM_INFO
Dim wProcessorArchitecture As UShort
Dim wReserved As UShort
Dim dwPageSize As UInteger
Dim lpMinimumApplicationAddress As UInteger ' LPVOID
Dim lpMaximumApplicationAddress As UInteger ' LPVOID
Dim dwActiveProcessorMask As UInteger ' DWORD_PTR
Dim dwNumberOfProcessors As UInteger
Dim dwProcessorType As UInteger
Dim dwAllocationGranularity As UInteger
Dim wProcessorLevel As UShort
Dim wProcessorRevision As UShort
End Structure
Structure SYSTEM_INFO2
Dim wProcessorArchitecture As UShort
Dim wReserved As UShort
Dim dwPageSize As UInteger
Dim lpMinimumApplicationAddress As IntPtr
Dim lpMaximumApplicationAddress As IntPtr
Dim dwActiveProcessorMask As UInteger ' DWOD_PTR
Dim dwNumberOfProcessors As UInteger
Dim dwProcessorType As UInteger
Dim dwAllocationGranularity As UInteger
Dim wProcessorLevel As UShort
Dim wProcessorRevision As UShort
End Structure
Declare Auto Sub GetSystemInfo Lib "kernel32.dll" (ByRef sysInfo As SYSTEM_INFO)
Declare Auto Sub GetNativeSystemInfo Lib "kernel32.dll" (ByRef sysInfo As SYSTEM_INFO2)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sInfo As SYSTEM_INFO
Dim sInfo2 As SYSTEM_INFO2
Dim msg1, msg2 As String
GetSystemInfo(sInfo)
GetNativeSystemInfo(sInfo2)
msg1 = "wProcessorArchitecture = " & sInfo.wProcessorArchitecture & vbCrLf & _
"wReserved = " & sInfo.wReserved & vbCrLf & _
"dwPageSize = " & sInfo.dwPageSize & vbCrLf & _
"lpMinimumApplicationAddress = " & sInfo.lpMinimumApplicationAddress.ToString("x") & vbCrLf & _
"lpMaximumApplicationAddress = " & sInfo.lpMaximumApplicationAddress.ToString("x") & vbCrLf & _
"dwActiveProcessorMask = " & sInfo.dwActiveProcessorMask & vbCrLf & _
"dwNumberOfProcessors = " & sInfo.dwNumberOfProcessors & vbCrLf & _
"dwProcessorType = " & sInfo.dwProcessorType & vbCrLf & _
"dwAllocationGranularity = " & sInfo.dwAllocationGranularity & vbCrLf & _
"wProcessorLevel = " & sInfo.wProcessorLevel & vbCrLf & _
"wProcessorRevision = " & sInfo.wProcessorRevision
msg2 = "wProcessorArchitecture = " & sInfo2.wProcessorArchitecture & vbCrLf & _
"wReserved = " & sInfo2.wReserved & vbCrLf & _
"dwPageSize = " & sInfo2.dwPageSize & vbCrLf & _
"lpMinimumApplicationAddress = " & sInfo2.lpMinimumApplicationAddress.ToString("x") & vbCrLf & _
"lpMaximumApplicationAddress = " & sInfo2.lpMaximumApplicationAddress.ToString("x") & vbCrLf & _
"dwActiveProcessorMask = " & sInfo2.dwActiveProcessorMask & vbCrLf & _
"dwNumberOfProcessors = " & sInfo2.dwNumberOfProcessors & vbCrLf & _
"dwProcessorType = " & sInfo2.dwProcessorType & vbCrLf & _
"dwAllocationGranularity = " & sInfo2.dwAllocationGranularity & vbCrLf & _
"wProcessorLevel = " & sInfo2.wProcessorLevel & vbCrLf & _
"wProcessorRevision = " & sInfo2.wProcessorRevision
MessageBox.Show(msg1, "sInfo members data")
MessageBox.Show(msg2, "sInfo2 members data")
Select Case sInfo.wProcessorArchitecture
Case PROCESSOR_ARCHITECTURE_INTEL
MessageBox.Show("32ビット です", "OSのバージョンは", MessageBoxButtons.OK, MessageBoxIcon.Information)
Case PROCESSOR_ARCHITECTURE_ARM
Case PROCESSOR_ARCHITECTURE_IA64
Case PROCESSOR_ARCHITECTURE_AMD64
MessageBox.Show("64ビット です", "OSのバージョンは", MessageBoxButtons.OK, MessageBoxIcon.Information)
Case PROCESSOR_ARCHITECTURE_ARM64
Case PROCESSOR_ARCHITECTURE_UNKNOWN
End Select
Select Case sInfo.dwProcessorType
Case PROCESSOR_INTEL_386
Case PROCESSOR_INTEL_486
Case PROCESSOR_INTEL_PENTIUM
MessageBox.Show("Pentium4 です", "CPUのタイプは", MessageBoxButtons.OK, MessageBoxIcon.Information)
Case PROCESSOR_INTEL_IA64
Case PROCESSOR_AMD_X8664
MessageBox.Show("AMD Ryzen9 です", "CPUのタイプは", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Select
End Sub
End Class
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*============================================================================*/