特にテーマは無く雑記かな。 最近は自分用メモが増えてきましたけど。
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


HSP2.61の小技その7というか移植
2006年09月22日 (金) | 編集 |
前からネタがあったのに、ここへ書くのを忘れていました。
今回は、ファイルのバージョン情報を取得してみようというお話です。

何か、ふかふかが新しく作っているソフトで使いたいのだそうです。
取り敢えず、相談されたネタだったのですが、ここに載せてみます。
…とはいっても、単にC言語から移植しただけですけどね。

それでは具体的なスクリプトです。
今回は2つに分かれています。1つ目のスクリプトを2つ目のスクリプトでインクルードして使用します。
それから、別途WA_MACROによるVERSION.DLL用のモジュール、VERSION.asが必要です。
// "GetVersion.as"
// ファイルのバージョン情報(会社名, ファイルバージョン, 著作権, ... )を取得するモジュール
// Copyright(C) 2006 Waterfowl, All right reserved.

// 参考
// ファイルのバージョン情報を取得する-Windows-水無瀬の部屋
// http://katsura-kotonoha.sakura.ne.jp/prog/win/tip00019.shtml

#module "GetVersionFunc"
#define MAX_PATH $00000104
//GetVersionInfoFunc
#deffunc GetVersionInfoFunc val,val
    mref FileName,24:mref pdwTrans,17
    mref stt,64
    dim pVersionInfo,1 // バージョンリソースを指すポインタ
    dim uDumy,1
    dim dwDumy,1
    dim dwSize,1 // バージョンリソースのサイズ
    // バージョンリソースのサイズを取得
    GetFileVersionInfoSize ptr(FileName),ptr(dwDumy):dwSize=dllret
    if dwSize<=0:stt=NULL:return // 失敗
    sdim VersionInfo,dwSize:int VersionInfo
    ll_getptr VersionInfo:ll_ret pVersionInfo
    // バージョンリソースを取得
    GetFileVersionInfo ptr(FileName),0,dwSize,pVersionInfo
    if dllret{
        // バージョンリソースの言語情報を取得
        VerQueryValue pVersionInfo,sptr("\\VarFileInfo\\Translation"),ptr(pdwTrans),ptr(uDumy)
        if dllret:stt=pVersionInfo:return // 成功
    }
    stt=NULL:return // 失敗
//GetVersionValueFunc
#define global GetVersionValueFunc(%1,%2,%3,%4) GetVersionValueDef %1,%4,%2,%3
#deffunc GetVersionValueDef val,str,int,int
    mref chBuffer,24:mref pVersionInfo,2:mref dwTrans,3:mref KeyWord,33
    mref stt,64
#define numofwCodePageID 12
#define numofwLanguageID 45
    dim pValue,1 // バージョンリソース中のバージョン情報を指すポインタ
    sdim Path,MAX_PATH+1
    dim uDumy,1
    dim wCodePageID,numofwCodePageID:wCodePageID=0,932,949,950,1200,1250,1251,1252,1253,1254,1255,1256
    dim wLanguageID,numofwLanguageID
    wLanguageID.0=0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040A,0x040B,0x040C
    wLanguageID.12=0x040D,0x040E,0x040F,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,0x0418
    wLanguageID.24=0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,0x0420,0x0421,0x0804,0x0807,0x0809
    wLanguageID.36=0x080A,0x080C,0x0810,0x0813,0x0814,0x0816,0x081A,0x0C0C,0x100C
    sdim chdwTrans,8:int chdwTrans
    sdim chwLanguageID,8:int chwLanguageID
    sdim chwCodePageID,8:int chwCodePageID
    int chdwTrans:chdwTrans=dwTrans:str chdwTrans,16+8
    Path="\\StringFileInfo\\"+chdwTrans+"\\"+KeyWord
    VerQueryValue pVersionInfo,ptr(Path),ptr(pValue),ptr(uDumy)
    if dllret:ll_peek chBuffer,pValue:stt=TRUE:return // 成功
    // バージョンリソースに言語情報が記録されていない場合
    dim cnti,1
    dim cntj,1
    repeat numofwCodePageID
        cnti=cnt
        repeat numofwLanguageID
            cntj=cnt
            int chwLanguageID:chwLanguageID=wLanguageID.cntj:str chwLanguageID,16+4
            int chwCodePageID:chwCodePageID=wCodePageID.cnti:str chwCodePageID,16+4
            Path="\\StringFileInfo\\"+chwLanguageID+""+chwCodePageID+"\\"+KeyWord
            VerQueryValue pVersionInfo,ptr(Path),ptr(pValue),ptr(uDumy)
            if dllret:ll_peek chBuffer,pValue:cntj=-1:cnti=-1:break // 成功
        loop
        if cntj==-1:break
    loop
    if cnti==-1:stt=TRUE:return // 成功
    chBuffer="":stt=FALSE:return // 失敗
#global
//GetVersionInfo,GetVersionValue
#define GetVersionInfo(%1) GetVersionInfoFunc %1,dwTrans@GetVersion:pVersionInfo@GetVersion=stat
#define GetVersionValue(%1) GetVersionValueFunc mrefrefstr@GetVersion,pVersionInfo@GetVersion,dwTrans@GetVersion,%1
    mref mrefrefstr@GetVersion,65:dim pVersionInfo@GetVersion,1:dim dwTrans@GetVersion,1
// ファイルからバージョン情報を取得するサンプル

#include "wam/VERSION.as"
#include "GetVersion.as"

    sdim InfoFile,256
    InfoFile="psapi.dll" ; ここに調べたいファイルを代入

    GetVersionInfo InfoFile
    if stat{
        GetVersionValue "FileDescription" // 説明を取得
        mes "FileDescription = "+refstr // 説明を表示
        GetVersionValue "ProductVersion" // 製品バージョンを取得
        mes "ProductVersion = "+refstr // 製品バージョンを表示
    }

    stop
移植しただけで、大した事は何も無いです。勿体ないのでここに載せてみただけです。

でもそれだけだと、流石に味気ないので一つ。
このスクリプトで"wam/VERSION.as"をインクルードしていますが、このモジュールはWA_MACROには添付されていません。自分で作成する必要があります。

WA_MACROに"lib2as.exe"という便利なツールが付属しているので、これを用いて"VERSION.LIB"から変換して作成すれば良いです。
これで、WA_MACROには付いて来なかったマクロでも、簡単に使う事ができるようになる訳です。

…あらら、今回スクリプト自体については、本当に何も解説しませんでしたね。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
りなえちゃんはピュッピュッしたことある??
2006/09/22(金) 02:29:43 | りなえちゃん大丈夫?
明日病院に行ってこようと思います。
2006/09/22(金) 02:29:43 | お待ちぃ!
誰か相手をしてください
2006/09/22(金) 02:29:45 | 先生だって女。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。