Q&A-システム編

システムの設定変更や取得にに関する質問をまとめました。

ディスプレイの解像度を変更するには
コンピュータ名を取得するには
バイナリコードをレジストリに設定・取得するには?
VBプログラムからフロッピーディスクのフォーマットをするには?
ファイルのバージョン情報や製品名、著作権を取得するには?
ショートカットを作成するには


Q ディスプレイの解像度を変更するには

VBのプログラムからのディスプレイの解像度を変更するにはどうしたら良いでしょうか?

A APIのChangeDisplaySettings を使用します

ディスプレイの解像度を変更するには、まず、現在設定できる解像度の情報を取得する必要があります。
設定できる解像度の情報を取得するには、EnumDisplaySettings というAPIを使用します。

■ 解像度の情報を取得するには

まず、標準モジュールに以下の宣言を入れます。

Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32

Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmLogPixels As Integer
    dmBitsPerPel As Long             'パレットのビット数
    dmPelsWidth As Long              '画面の幅
    dmPelsHeight As Long             '画面の高さ
    dmDisplayFlags As Long           '
    dmDisplayFrequency As Long  '周波数
    dmICMMethod As Long
    dmICMIntent As Long
    dmMediaType As Long
    dmDitherType As Long
    dmICCManufacturer As Long
    dmICCModel As Long
    dmPanningWidth As Long
    dmPanningHeight As Long
End Type

Public Const DM_GRAYSCALE = &H1
Public Const DM_INTERLACED = &H2

Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" ( _
    ByVal lpDeviceName As String, _
    ByVal iModeNum As Long, _
    lpDevMode As DEVMODE) As Long

解像度を取得する為に、以下のコードを実行します。

Dim lngIndex As Long
Dim dev(1000) As DEVMODE

lngIndex = 0&

Do While EnumDisplaySettings(vbNullString, lngIndex, dev(lngIndex)) <> 0
    lngIndex = lngIndex + 1
Loop

解像度の情報が dev() に入り、情報の数は、lngIndex に取得できます。

ここで、解像度の変更で必要な情報は、以下の5つの情報ですy。

dmBitsPerPel パレットのビット数
dmPelsWidth 画面の幅
dmPelsHeight 画面の高さ
dmDisplayFrequency 周波数
dmDisplayFlags DM_GRAYSCALE が設定されている場合は、モノクロのデバイス。設定されていない場合は、カラーデバイス
DM_INTERLACED が設定されている場合は、インターレス。設定されていない場合は、ノンインターレス


■ 解像度を変更するには

まず、標準モジュールに以下の宣言を入れます。

'dmFields
Public Const DM_BITSPERPEL = &H40000
Public Const DM_PELSWIDTH = &H80000
Public Const DM_PELSHEIGHT = &H100000
Public Const DM_DISPLAYFLAGS = &H200000
Public Const DM_DISPLAYFREQUENCY = &H400000
'DM_POSITION は、Win98 WinNT5.0 から

'dwFlags
Public Const CDS_UPDATEREGISTRY = &H1&
Public Const CDS_TEST = &H2&
Public Const CDS_FULLSCREEN = &H4&
Public Const CDS_GLOBAL = &H8&
Public Const CDS_SET_PRIMARY = &H10&
Public Const CDS_RESET = &H40000000
Public Const CDS_NORESET = &H10000000


Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" ( _
    lpDevMode As Any, _
    ByVal dwFlags As Long) As Long

' ChangeDisplaySettings からの戻り値
Public Const DISP_CHANGE_SUCCESSFUL = 0
Public Const DISP_CHANGE_RESTART = 1
Public Const DISP_CHANGE_FAILED = -1
Public Const DISP_CHANGE_BADMODE = -2
Public Const DISP_CHANGE_NOTUPDATED = -3
Public Const DISP_CHANGE_BADFLAGS = -4
Public Const DISP_CHANGE_BADPARAM = -5

解像度を取得する為に、以下のコードを実行します。

r& = ChangeDisplaySettings(dev(i), 0)

dev(i) は、 EnumDisplaySettings で取得した解像度の情報を設定します。2番目のパラメータにの dwFlags には以下の値を設定します。

0 現在の画面の情報が変更されます。レジストリの情報は更新されません。
CDS_UPDATEREGISTRY 現在の画面の情報が変更され、レジストリの情報も更新されます。
CDS_TEST 要求された DEVMODE の設定が使用できるかをテストします。
CDS_FULLSCREEN Windows NT のみ指定できます。一時的な設定です。他のデスクトップから設定を変更しても、ここで設定した設定は、変更されません。
CDS_GLOBAL このパラメータを設定した場合、全てのユーザの設定が変更されます。設定しない場合は、現在のユーザの情報だけが更新されます。CDS_UPDATEREGISTRY と同時には指定できません。
CDS_SET_PRIMARY 指定された設定がデフォルトの設定になります。
CDS_RESET 指定された設定が現在の設定と同じでも、設定が行われます。
CDS_NORESET レジストリを更新しますが、画面は変更しません。CDS_UPDATEREGISTRY と同時には指定できません。

ChangeDisplaySettings の戻り値は、以下の通りです。

DISP_CHANGE_SUCCESSFUL 設定に成功しました。
DISP_CHANGE_RESTART 設定を遊行する為には、このコンピュータは再起動する必要があります。
DISP_CHANGE_FAILED 設定に失敗しました。
DISP_CHANGE_BADMODE 指定された設定は、サポートされていません。
DISP_CHANGE_NOTUPDATED 指定した設定をレジストリに書き込めません。(Windows NT のみ返されます。)
DISP_CHANGE_BADFLAGS dmFields で指定したフラグが正しくありません。
DISP_CHANGE_BADPARAM パラメータで指定した値が正しくありません。(フラグが正しくない場合も含みます。)

変更する解像度の設定を限定したい場合は、dev(i) の dmFields に指定したい項目のフラグを設定してEnumDisplaySettings を呼んでください。

'画面の幅と高さのみ変更
dev(i).dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT

また、dwFlags 0を設定した場合や一時的に設定を変更した場合は、以下のように、第一引数を ByVal 0& 、 第二引数に0 を指定すれば、元の解像度に戻る事ができます。

ChangeDisplaySettings ByVal 0&, 0


(注意)Win95 では、現在設定されてる色数から別の色数には変更できません。

(注意)このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意)ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います


Q コンピュータ名を取得するには

コントロールパネルで設定したコンピュータ名を取得するにはどうしたらよいのですか?

A APIの GetComputerName または WSH のオブジェクトを使用します

コンピュータ名を取得する方法は、大きく分けてAPIを使用する方法と、WSH (Windows Script Host)のオブジェクトを使用する方法があります。APIを使用する場合は、APIの宣言等が面倒ですが、環境に依存しないコードが作成できます。一方、WSH を使用する場合、APIの宣言等は不要で手軽にコードを作成できるのですが、反面、WSH がインストールされている環境でなければ使用できません。

■ APIを使用する場合

コンピュータ名を取得する API は GetComputerName を使用すれば取得できますが、1つだけ注意することがあります。コンピュータ名を取得する時バッファーのサイズを指定する MAX_COMPUTERNAME_LENGTH という定数が APIビューアに現れません。このサイズは、Visual C++ の ヘッダーファイルを検索すると以下のように定義されてます。

#define MAX_COMPUTERNAME_LENGTH 15

これを、VBで宣言するには、以下の宣言を標準モジュールに入れます。

Public Const MAX_COMPUTERNAME_LENGTH = 15

Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long


これで、以下のようにコンピュータ名が取得できます。

Dim strBuf As String

strBuf = Space(MAX_COMPUTERNAME_LENGTH + 1)
GetComputerName strBuf, MAX_COMPUTERNAME_LENGTH

'ラベルにコンピュータ名を表示

lblName.Caption = strBuf

また、この strBuf の内容は、C言語で使用する NULL文字(Chr$(0))で終了する文字列になっているので、コンピュータ名の後ろに Chr$(0)と空白が付加されています。VBで扱い易いように、このChr$(0)以降の文字を以下のように削除します。

Dim strBuf As String
Dim intPos As Integer

strBuf = Space(MAX_COMPUTERNAME_LENGTH + 1)
GetComputerName strBuf, MAX_COMPUTERNAME_LENGTH

'Chr$(0)以降の文字を削除
intPos = InStr(strBuf, Chr$(0))
If intPos > 0 Then
    strBuf = Left$(strBuf, intPos - 1)
End If

'ラベルにコンピュータ名を表示

lblName.Caption = strBuf


■ WSHを使用する場合


WSH を使用する場合のコードは簡単です。

Dim WshNetwork As Object
Dim strComputerName As Object

Set WshNetwork = CreateObject("WScript.Network")

strComputerName = WshNetwork.ComputerName
MsgBox strComputerName

Set WshNetwork = Nothing

見ても分かる通り、CreateObject で "WScript.Network" のオブジェクトを WshNetwork に作成して、WshNetwork のComputerNameプロパティを参照するだけです。
同様に WshNetwork のプロパティには、以下のようなプロパティがあります。

ComputerName コンピュータ名
UserDomain ドメイン名
UserName ユーザ名

(注意)WSHを使用する場合には、以下の環境のいずれかが必要です。

・Internet Explorer の 5.0 以上
・Windows NT 4.0 のOption Pach
・Windows 98
・MSのサイトよりWSHをダウンロードしてインストール

詳細に付いては以下を参照してください。
http://www.asia.microsoft.com/Japan/Developer/Scripting/

(注意)このページの内容は、Visual Basic5.0(SP3)Visual Basic6.0(SP3)を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います


Q バイナリコードをレジストリに設定・取得するには?

バイナリのデータをレジストリに設定・取得するにはどうすれば良いのですか?

A APIを使用すれば案外簡単にできます

バイナリのレジストリの設定、取得は API を使用すれば案外簡単にできます。設定・取得方法は、次の通りです。

■ バイナリのレジストリの設定
1. RegCreateKey で、親キーとサブキーを指定して、サブキーまでを作成 します。この時、ハンドルとなる hKey を受け取ります。
2. RegSetValueEx で  hKey 、キー、値を指定して、データを書き込みます。   このとき、データのタイプに REG_BINARY を指定すればバイナリとなります。
3. RegCloseKey で  hKey を渡してクローズします。

■ バイナリのレジストリの取得
1. RegOpenKeyで、親キーとサブキーを指定して、オープンします。   この時、ハンドルとなる hKey を受け取ります。
2. RegQueryValueExで  hKey 、キー、値を指定して、データを取得します。   また、取得したデータのタイプも返されます。
3. RegCloseKey で  hKey を渡してクローズします。

以下は、サンプルです。データは、バイト型の配列を使用してますが、
String 型だと、Unicode と Shift Jis の変換が発生するので、バイト型を使用した方が安全です。

'バイナリのレジストリの取得
Private Sub cmdRegGet_Click()
    Dim r As Long
    Dim hKey As Long
    Dim bData(9) As Byte
    Dim i As Integer
    Dim lngType As Long

    '引数: 主キー、サブキー、hKey
    r = RegOpenKey(HKEY_CURRENT_USER, "MyData", hKey)
    If r <> ERROR_SUCCESS Then
        MsgBox "RegOpenKey Error"
        Exit Sub
    End If

    '引数: hKey、キー、0 固定、取得したデータのタイプ、バイト列の先頭アドレス、サイズ
    r = RegQueryValueEx(hKey, "BinaryData", 0&, lngType, bData(0), 10)
    If r <> ERROR_SUCCESS Or lngType <> REG_BINARY Then
        MsgBox "RegQueryValueEx Error"
        Exit Sub
    End If

   '引数: hKey
    RegCloseKey hKey

    For i = 0 To 9: Debug.Print bData(i): Next

End Sub

'バイナリのレジストリの設定
Private Sub cmdRegSet_Click()
    Dim r As Long
    Dim hKey As Long
    Dim bData(9) As Byte
    Dim i As Integer

   
    '引数: 主キー、サブキー、hKey
    r = RegCreateKey(HKEY_CURRENT_USER, "MyData", hKey)
    If r <> ERROR_SUCCESS Then
        MsgBox "RegCreateKey Error"
        Exit Sub
    End If

    For i = 0 To 9: bData(i) = i: Next

   '引数: hKey、キー、0 固定、REG_BINARY、バイト列の先頭アドレス、サイズ
    r = RegSetValueEx(hKey, "BinaryData", 0&, REG_BINARY, bData(0), 10)
    If r <> ERROR_SUCCESS Then
        MsgBox "RegSetValueEx Error"
        Exit Sub
    End If

   '引数: hKey
    RegCloseKey hKey

End Sub

以下は、宣言部です。標準モジュールに入れてください。

Option Explicit

Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Public Const ERROR_SUCCESS = 0&
Public Const ERROR_NO_MORE_ITEMS = 259&

Public Const REG_SZ = 1
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4

Declare Function RegCreateKey Lib "advapi32" Alias "RegCreateKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpszSubKey As String, _
    phkResult As Long) As Long

Declare Function RegOpenKey Lib "advapi32" Alias "RegOpenKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpszSubKey As String, _
    phkResult As Long) As Long

Declare Function RegCloseKey Lib "advapi32" ( _
    ByVal hKey As Long) As Long

Declare Function RegDeleteKey Lib "advapi32" Alias "RegDeleteKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpszSubKey As String) As Long

Declare Function RegEnumKey Lib "advapi32" Alias "RegEnumKeyA" ( _
    ByVal hKey As Long, _
    ByVal iSubKey As Long, _
    ByVal lpszName As String, _
    ByVal cchName As Long) As Long

Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" ( _
    ByVal hKey As Long, _
    ByVal lpszValueName As String, _
    ByVal dwReserved As Long, _
    ByVal fdwType As Long, _
    lpbData As Any, _
    ByVal cbData As Long) As Long

Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" ( _
    ByVal hKey As Long, _
    ByVal lpszValueName As String, _
    ByVal dwReserved As Long, _
    lpdwType As Long, _
    lpbData As Any, _
    cbData As Long) As Long


(注意)このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意)ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q VBプログラムからフロッピーディスクのフォーマットをするには?

VBのプログラムから、フロッピーディスクのフォーマットを行うにはどうしたらよいでしょうか?

A API の SHFormatDrive でできます

API の SHFormatDrive は、以下のようなパラメータを持っています。

Declare Function SHFormatDrive Lib "shell32" ( _
    ByVal hwnd As Long, _
    ByVal drive As Long, _
    ByVal fmtID As Long, _
    ByVal options As Long) As Long

各パラメータの意味は次の通りです。

パラメータ 意味
hwnd フォーマットのダイアログを表示する、親ウィンドウの hWnd を指定します。
drive フォーマットするドライブを 0 から指定します(0 -- ドライブA、 1 -- ドライブB、2 -- ドライブC)
fmtID 固定で SHFMT_ID_DEFAULT (&HFFFF) を指定します。
options ダイアログの初期設定を指定します。
SHFMT_OPT_QUICK       -- クイックフォーマット(フォーマットのダイアログのクイックフォーマットのチェックがONとなります。)
SHFMT_OPT_FULL         -- 通常のフォーマット(フォーマットのダイアログのクイックフォーマットのチェックがOFFとなります。)
SHFMT_OPT_SYSONLY  -- 起動専用

戻り値は、フォーマットの最後のステータスを返します。

戻り値 意味
SHFMT_NOFORMAT 指定されたドライブはフォーマット不能
SHFMT_CANCEL キャンセルが選択された
SHFMT_ERROR ドライブフォーマット中にエラーが発生
上記以外 正常終了

ただし、私が NT4.0(SP4)、VB5.0(SP3)で実験したところ、エラーの場合は SHFMT_ERROR しかか返りませんでした(^^;

それでは、サンプルです。

Dim lngDrive As Long
Dim r As Long

lngDrive = 0      ' 0 -- A Drive, 1 -- B Drive, 2 -- C Drive ....
r = SHFormatDrive(Me.hwnd, lngDrive, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICK)

Select Case r
Case SHFMT_ERROR
    MsgBox ("ドライブフォーマット中にエラーが発生しました")
Case SHFMT_CANCEL
    MsgBox ("キャンセルが選択されました")
Case SHFMT_NOFORMAT
    MsgBox ("指定されたドライブはフォーマット不能です")
End Select

また、SetErrorMode というAPIを使用すると、OSの致命的なエラーに関するメッセージボックスを表示するかしないかを、指定することができます。

●致命的なエラーを表示させない場合。

Dim OldMode As Long

OldMode = SetErrorMode(0)   '以前のモードを保存
SetErrorMode (OldMode Or SEM_FAILCRITICALERRORS)
   
SHFormatDriveを実行
   
SetErrorMode OldMode             '以前のモードに戻す

●致命的なエラーを表示させる場合。

Dim OldMode As Long

OldMode = SetErrorMode(0)   '以前のモードを保存
SetErrorMode (OldMode And Not SEM_FAILCRITICALERRORS)
   
SHFormatDriveを実行
   
SetErrorMode OldMode          '以前のモードに戻す


以下は、宣言部です。標準モジュールに入れてください。

Public Const SHFMT_OPT_QUICK = &H0&
Public Const SHFMT_OPT_FULL = &H1&
Public Const SHFMT_OPT_SYSONLY = &H2&

Public Const SHFMT_ID_DEFAULT = &HFFFF

Public Const SHFMT_NOFORMAT = -3&
Public Const SHFMT_CANCEL = -2&
Public Const SHFMT_ERROR = -1&


Declare Function
SHFormatDrive Lib "shell32" ( _
    ByVal hwnd As Long, _
    ByVal drive As Long, _
    ByVal fmtID As Long, _
    ByVal options As Long) As Long


Public Const
SEM_FAILCRITICALERRORS = &H1&

Declare Function
SetErrorMode Lib "kernel32" ( _
    ByVal
wMode As Long) As Long

(注意) このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q ファイルのバージョン情報や製品名、著作権を取得するには?

エクスプローラでファイルのDLLやEXEのプロパティを見ると、ファイルのバージョンや、製品名、著作権といった情報が見られますが、VBからそれらの情報を取得するにはどうしたらよいでしょうか?

A GetFileVersionInfo、VerQueryValue といったAPIで取得できます

ファイルのバージョン情報は、以下のような GetFileVersionInfo、VerQueryValue で取得できます。

Dim lngRet As Long
Dim lngDummy As Long
Dim bBuffer() As Byte
Dim lngLen As Long
Dim lpBuffer As Long
Dim ffi As VS_FIXEDFILEINFO

' strFileName に取得したいファイル名をセット
strFileName = "OLEAUT32.DLL"

' サイズを取得
lngLen = GetFileVersionInfoSize(strFileName, lngDummy)
If lngLen < 1 Then
    Exit Sub
End If

' バイトの配列の領域取得
ReDim bBuffer(lngLen)

' ファイル バージョン情報を取得
lngRet = GetFileVersionInfo(strFileName, 0&, lngLen, bBuffer(0))
lngRet = VerQueryValue(bBuffer(0), "\", lpBuffer, lngLen)

' バイトの処理
MoveMemory ffi, lpBuffer, Len(ffi)

' ファイル バージョン
Debug.Print "FileViersion = " & _
Format$(ffi.dwFileVersionMSh) & "." & _
Format$(ffi.dwFileVersionMSl) & "." & _
Format$(ffi.dwFileVersionLSh) & "." & _
Format$(ffi.dwFileVersionLSl)

' 製品バージョン
Debug.Print "ProductVersion = " & _
Format$(ffi.dwProductVersionMSh) & "." & _
Format$(ffi.dwProductVersionMSl) & "." & _
Format$(ffi.dwProductVersionLSh) & "." & _
Format$(ffi.dwProductVersionLSl)

ここで、ポイントになるのが、VerQueryValue の2番目のパラメータに "\" を指定していることです。この場合、3番目のパラメータの lpBuffer という Long型の変数に、バージョン情報の構造体(VS_FIXEDFILEINFO)の先頭アドレスを返します。

製品名、著作権の取得は、以下のように VerQueryValue の引数に "\VarFileInfo\Translation" というパラメータを設定して、取得します。

Dim strFileName As String
Dim lngRet As Long
Dim lngDummy As Long
Dim bBuffer() As Byte
Dim lngLen As Long
Dim lpBuffer As Long
Dim cp As CODEPAGE
Dim strPath As String

' strFileName に取得したいファイル名をセット
strFileName = "OLEAUT32.DLL"

' サイズを取得
lngLen = GetFileVersionInfoSize(strFileName, lngDummy)
If lngLen < 1 Then
    Exit Sub
End If

' バイトの配列の領域取得
ReDim bBuffer(lngLen)

' ファイル バージョン情報を取得
lngRet = GetFileVersionInfo(strFileName, 0&, lngLen, bBuffer(0))
lngRet = VerQueryValue(bBuffer(0), "\VarFileInfo\Translation", lpBuffer, lngLen)

' 文字列情報の設定
MoveMemory cp, lpBuffer, lngLen
strPath = "\StringFileInfo\" & Right$("0000" & Hex$(cp.lngLOW), 4) & Right$("0000" & Hex$(cp.lngHIGH), 4) & "\"

Dim strProductName As String
Dim strLegalCopyright As String

'製品名の取得
lngRet = VerQueryValue(bBuffer(0), strPath & "ProductName", lpBuffer, lngLen)
strProductName = Space(lngLen)
MoveMemory ByVal strProductName, lpBuffer, lngLen

'著作権の取得
lngRet = VerQueryValue(bBuffer(0), strPath & "LegalCopyright", lpBuffer, lngLen)
strLegalCopyright = Space(lngLen)
MoveMemory ByVal strLegalCopyright, lpBuffer, lngLen

最初のVerQueryValueでは、lpBuffer に言語IDといわれる4バイトの数値の先頭アドレスを返します。この4バイトの数値を使って、VerQueryValue を再度呼び出すと製品名や著作権情報が取得できます。この時、2番目のパラメータは以下のような形式で指定します。

\StringFileInfo\lang-code\string-name

パラメータ 設定値
\StringFileInfo\ 固定
lang-code 最初のVerQueryValueで取得した4バイトの言語IDを、8桁の16進数文字列にして指定する
string-name 取得したい情報の文字列を設定する。以下の文字列を指定する
文字列 取得できる情報
"Comments"
"CompanyName"
"FileDescription"
"FileVersion"
"InternalName"
"LegalCopyright"
"LegalTrademarks"
"OriginalFilename"
"PrivateBuild"
"ProductName"
"ProductVersion"
"SpecialBuild"
コメント
社名
説明
ファイルバージョン
内部名
著作権
商標
正式ファイル名
プライベートビルド情報
製品名
製品バージョン
スペシャルビルド情報

従って、上記プログラムでは、以下の ProductName の部分を代えることによって各情報が取得できます。

'製品名の取得
lngRet = VerQueryValue(bBuffer(0), strPath & "ProductName", lpBuffer, lngLen)


以下は、宣言部です。標準モジュールに入れてください。

Type VS_FIXEDFILEINFO
    dwSignature As Long
    dwStrucVersionl As Integer
    dwStrucVersionh As Integer
    dwFileVersionMSl As Integer
    dwFileVersionMSh As Integer
    dwFileVersionLSl As Integer
    dwFileVersionLSh As Integer
    dwProductVersionMSl As Integer
    dwProductVersionMSh As Integer
    dwProductVersionLSl As Integer
    dwProductVersionLSh As Integer
    dwFileFlagsMask As Long
    dwFileFlags As Long
    dwFileOS As Long
    dwFileType As Long
    dwFileSubtype As Long
    dwFileDateMS As Long
    dwFileDateLS As Long
End Type

Type CODEPAGE
    lngLOW As Integer
    lngHIGH As Integer
End Type

Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" ( _
    ByVal lptstrFilename As String, _
    ByVal dwHandle As Long, _
    ByVal dwLen As Long, _
    lpData As Any) As Long

Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" ( _
    ByVal lptstrFilename As String, _
    lpdwHandle As Long) As Long

Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" ( _
    pBlock As Any, _
    ByVal lpSubBlock As String, _
    lplpBuffer As Any, _
    puLen As Long) As Long

Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    dest As Any, _
    ByVal Source As Long, _
    ByVal length As Long)


(注意) このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q ショートカットを作成するには

デスクトップなどに、プログラムのショートカットを作成するにはどうしたら良いのですか?

A WSH のオブジェクトを使用すればできます

ショートカットを作成するには、WSH (Windows Script Host)のオブジェクトを使用すればできます。WSH を使用する場合、APIの宣言等は不要で手軽にコードを作成できるのですが、反面、WSH がインストールされている環境でなければ使用できません。WSH を使用しない場合は、IShellLink というインターフェースを使用するタイプライブラリが必用です。(やり方は、後日時間があったら作成します ^^;)

さっそくサンプルを見てみましょう。

Dim WshShell As Object
Dim oShellLink As Object
Dim strDesktop As String

Set WshShell = CreateObject("WScript.Shell")

strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\メモ帳.lnk")
oShellLink.TargetPath = "notepad"
oShellLink.IconLocation = "notepad.exe,0"
oShellLink.Save

Set oShellLink = Nothing
Set WshShell = Nothing

1. 最初の CreateObjec で WshShell という WSH のオブジェクトを作成しています。

2.
WshShell のメソッドの SpecialFolders メソッドで、Desktop のパス名を取得します。SpecialFolders の引数には、以下のような引数が使用できます。

引数 使用できる Windows のバージョン
AllUsersDesktop Windows NT
AllUsersStartMenu Windows NT
AllUsersPrograms Windows NT
AllUsersStartup Windows NT
Desktop Windows NT/95/98
Favorites Windows NT/95/98
Fonts Windows NT/95/98
MyDocuments Windows NT/95/98
NetHood Windows NT/95/98
PrintHood Windows NT/95/98
Programs Windows NT/95/98
Recent Windows NT/95/98
SendTo Windows NT/95/98
StartMenu Windows NT/95/98
Templates Windows NT

3.WshShell のメソッドの CreateShortcut で パス名の strDesktop を指定して、メモ帳の lnk ファイル名を指定します。これで、oShellLink という ショートカット作成用のオブジェクトが作成されます。

4.作成された oShellLink のプロパティを設定して、ショートカットのファイル名、アイコン等を設定します。プロパティとプロパティの使い方は次の通り。

プロパティ 使い方
Description 記述を設定します。
FullName フルパス名を返します(読込み専用)。
Hotkey ショートカットキーを設定します。以下の文字列を組み合わせます。
"ALT+" | "CTRL+" | "SHIFT+" | "EXT+"
"A" .. "Z" |
"0".. "9" |
"Back" | "Tab" | "Clear" | "Return" |
"Escape" | "Space" | "Prior" | ...
IconLocation アイコンのファイル名と何番目のアイコンかを "," で区切って指定します。
TargetPath 目的となるファイル名を指定します。
WindowStyle Window のスタイルを設定
1 -- アクティブにしてウィンドウを表示します。元のウィンドウが、最大化、最小化されている場合は、元の状態でウィンドウを表示します。
3 -- アクティブにしてウィンドウを最大化表示します。
7 --最小化して、次のトップレベルのウィンドウをアクティブにします。

5.oShellLink の Save メソッドでショートカットを保存します。

6.最後に不要になったオブジェクトを削除します。

(注意)WSHを使用する場合には、以下の環境のいずれかが必要です。

・Internet Explorer の 5.0 以上
・Windows NT 4.0 のOption Pach
・Windows 98
・MSのサイトよりWSHをダウンロードしてインストール

詳細に付いては以下を参照してください。
http://www.asia.microsoft.com/Japan/Developer/Scripting/

(注意)このページの内容は、Visual Basic5.0(SP3)Visual Basic6.0(SP3)を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。