>17,41行目のdupptr命令はなにをしているのですか?
VerQueryValueで取得される値がポインタなので
dupptrを使って変数として扱えるようにしているだけです。
そのまま使うと下記のようにポインタが表示されるだけになります。
i = 123;
mes i; // 通常の変数
mes varptr(i); // 変数のポインタ
>また、31行目のstrf命令は、
>%04xを16進数に変換しているのは分かるのですが、
>その %04x の「04」はなにを表しているのですか?
>桁数みたいなものなのでしょうか?
>それならなぜ4桁(4yte)を指定しているのに
>wpeekで2byteしか取得しないのでしょうか?
『dupptr LangCode, pLangCode, 4, 4;』
このdupptrの最後に4を指定しているので
LangCodeは整数型(32ビット=4バイト)の変数になります。
丁寧に書くと下記が分かりやすいでしょうか。
dupptr LangCode, pLangCode, 4, 4;
High = (LangCode >> 16) & 0xFFFF; // 上位16ビット(2バイト)を取得
Low = LangCode & 0xFFFF; // 下位16ビット(2バイト)を取得
LangCode = (Low << 16) & High; // 上位と下位の入れ替え
// 〜省略〜
SubBlock = strf("\\StringFileInfo\\%08X\\", LangCode );
これが面倒だったのでwpeekで省略させていただきました。
また、VerQueryValueの仕様で16進数で8桁の文字列と決まっているので
桁を揃えるために%04Xとしています。
整数型と文字列型が混在しているのでわかりにくくなっていますが、
16進数で『FF』は文字としては2文字(バイト)ですが、
整数型変数では1バイトです。
つまり、整数型の変数で2バイト分取得して
16進の文字列に変換すると4バイトになります。
%04xの桁などは下記のソースを参考にしてみて下さい。
i = 0x0123ABCD;
iHigh = (i >> 16) & 0xFFFF; // 上位16ビット(2バイト)を取得
iLow = i & 0xFFFF; // 下位16ビット(2バイト)を取得
mes "上位16ビットと下位16ビットを分割して表示\n";
mes strf("元の数値:\t%04X,%04X", iHigh, iLow); // 元の数値(16進数)
mes strf("入れ替えた数値:%04X,%04X", iLow, iHigh); // 上位と下位の入れ替え
mes strf("wpeek使用(桁無し )%X,%X", wpeek(i, 0), wpeek(i,2)); // 桁無し
mes strf("wpeek使用(桁有り1)%4X,%4X", wpeek(i, 0), wpeek(i,2)); // 桁有り(上の0はスペースで代用される)
mes strf("wpeek使用(桁有り2)%04X,%04X", wpeek(i, 0), wpeek(i,2)); // 桁有り(0も反映される)
ちなみにXを大文字にすると16進の文字も『FFFF』と大文字になりますし、
小文字のxにすると16進の文字も『ffff』のように小文字になります。