AB4.2Xでのバージョン情報の取得について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
かーくん

AB4.2Xでのバージョン情報の取得について

#1 投稿記事 by かーくん »

久しぶりにプログラムすることになり、どーせなら最新版でと思い、
がんばってますが、うまくいかなくて苦労しています。
みなさん申し訳ありませんが、こんな私に力をかしてください。

質問は、ファイルのバージョン情報取得方法についてです。
古いABソースを引っ張り出して、AB4.22に書き直しましたが、
うまく動作してくれません。
参考にAB4.13まで動いたソースを書いておきますので、AB4.22で動かすための
修正箇所を教えてください。
宜しくお願いします。

※ ソースは昔見つけたVB版を訳もわからず、ABに書き直したものです。
  今でも意味はわかっていませんが・・・。

コード: 全て選択


Declare Function GetFileVersionInfoSize Lib "Version.dll" _
  Alias "GetFileVersionInfoSizeA" _
  (ByVal lptstrFilename As String, ByVal lpdwHandle As DWord) As DWord
Declare Function GetFileVersionInfo Lib "Version.dll" _
  Alias "GetFileVersionInfoA" _
  (ByVal lptstrFilename As String, ByVal dwHandle As DWord, _
   ByVal dwLen As DWord, ByRef lpData As Any) As DWord
Declare Function VerQueryValue Lib "Version.dll" _
  Alias "VerQueryValueA"
  (pBlock As VoidPtr, ByVal lpSubBlock As String, _
   ByRef lplpBuffer As VoidPtr, ByRef puLen As DWord) As DWord

Type CODEPAGE
  cpLOW          As Integer
  cpHIGH         As Integer
End Type

Sub MainWnd_CommandButton1_Click()

	Dim strTargetFileName	          As String
	Dim SizeOfVersionInfo	          As DWord
	Dim DummyHandle                    As DWord
	Dim bytDummyVersionInfo[2048]      As Byte
	Dim PointerVersionInfo             As VoidPtr
	Dim LengthVersionInfo	          As DWord
	Dim Win32apiResultCode             As DWord
	Dim typCODEPAGE					As CODEPAGE
	Dim strTemp						As String

	strTargetFileName = "C:\WINDOWS\system32\calc.exe"
	SizeOfVersionInfo = GetFileVersionInfoSize(strTargetFileName, _
		DummyHandle)
	If SizeOfVersionInfo > 0 Then
		Win32apiResultCode = GetFileVersionInfo(strTargetFileName, 0, _
		SizeOfVersionInfo, bytDummyVersionInfo[0])
		Win32apiResultCode = VerQueryValue(bytDummyVersionInfo[], _
		"\VarFileInfo\Translation", PointerVersionInfo, LengthVersionInfo)
		memcpy(VarPtr(typCODEPAGE), PointerVersionInfo, LengthVersionInfo)
		Dim strPath				As String
		Dim strCodeLow		 	As String
		Dim strCodeHigh			As String
		strCodeLow = Hex$(typCODEPAGE.cpLOW)
		strCodeHigh = Hex$(typCODEPAGE.cpHIGH)
		strPath = "\StringFileInfo\" + Right$("0000" + strCodeLow, 4) _
		+ Right$("0000" + strCodeHigh, 4) + "\"
		Dim strPathFull			As String
		strPathFull = strPath + "ProductName"
		Win32apiResultCode = VerQueryValue(bytDummyVersionInfo[], _
		strPathFull, PointerVersionInfo, LengthVersionInfo)
		strTemp = Space$(LengthVersionInfo)
		memcpy(StrPtr(strTemp), PointerVersionInfo, LengthVersionInfo)
		If Len(strTemp) > 1 Then
		   MsgBox 0, Left$(strTemp, Len(strTemp) - 1)
		End If
	End If

End Sub
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

> Declare Function VerQueryValue Lib "Version.dll" _
> Alias "VerQueryValueA" _
上の行で下線が抜けているのがエラーになりました。

あと全角スペースがあるというエラーがどこかでありましたが,
その行の空白を一旦全て削除し,タブや半角スペースを挿入しなおして対処しました。

それだけで実行できましたが,VB由来の部分をAB風に直してみます。
つまりABの特徴を生かすようにするということです。 結果こうなりました。
かーくん

#3 投稿記事 by かーくん »

イグトランスさん、たくさん教えていただき、ありがとうございます。

私の頭でコードがなかなか理解できず、MSDNなどを読んでも、
もっと初心者に理解できる言葉で書いてくれ!という感じで部分読みして、
後は勘?のようなものでプログラミングしてました。

なので、今回の様にコード説明をしていただけると、
私のようなものには涙がでるくらいうれしいことです。
ほんとに感謝します。

すぐには理解できませんが、いままでのコードと比較できるので
勉強にも活用させていただきます。



下線と全角スペースエラーを修正したら動いたと記述がありましたが
えっ?と思い、自分の書き込みをコピーしなおして、エラー修正すると
なっ、なんと、動いてしまいました。
(エラー箇所は、質問板に書き込む時の誤りでした。)

実はコード作成しているのが会社PCで、そこで動かなかったので
投稿しましたが、返信を頂いて実験したのが自宅PCなのです。

会社PCでの動作は出勤しないと確認できないのですが、自宅PCで動いたと
いうことは、コードに大きな問題はなかったということになります。
なので、環境を調査する必要あり、ということになってしまいました。


今回はABの勉強させていただいたという結果になりましたが、
イグトランスさんのコードはしっかりと使わせていただきます。
ありがとうございました。

また、環境についてわからないことがあったら質問させていただきます。
返信する