詳細かつ解かり易い解説ありがとうございます。
文法エラーの部分は、Cの環境が無いので確認できていませんでした。 明確に間違いという認識はありませんでいたが、MSDNを参考に してVBに書き換えたら、結果的にクリアしていました。
> リソースは16個ずつのIDをまとめて、ブロックとして保存してます。 > > ブロックの中身は > 文字数(2バイト) > 文字(2バイトx文字数) > > ; > と16個並びます。 > 最初に2バイト文字数のデータが入っていて、 > 次にその文字数分、文字データが入っているという、繰り返しです。 > ここの文字データはワイドキャラで入っているので、1文字2バイト > になっています。
文字列リソースの場合、0 から 15 のリソースIDは、ブロックID=1、 16 から 31 のリソースIDは、ブロックID=2 に属する。というのは、 調査で解かったんですが、その中身については、解かりませんでしたが、 Call CopyMemory(nStrLen, ByVal ptrVal, 2) のVBコードを拝見して、nStrLenがByRefだからヘッダ部の文字数か バイト数を読んでいるのかなとは想像していました。 今回のレスでスッキリしました。
> lpwszはLPWSTRという型で宣言されています。 > LPWSTRは、2バイトのWCHAR型を指す、ポインタと定義されているので、 > lpwsz++; すなわち lpwsz = lpwsz + 1; > で、2バイト進みます。
LPWSTRをMSDNで調べたら「16ビットUnicode文字のnull終端文字列へのポインタ」 とありましたので納得です。 Call CopyMemory(yBuffer(0), ByVal lptr, 512) sBuffer = yBuffer Unicode文字だから、VBでポインタから文字列に変換するのにバイト配列 で受けた後、StrConv関数でUnicodeに変換する必要が無いんですよね?
> で、肝心のfor文に入ります。 > まず、for文をわかりやすく、書き換えます。 > > では、もう少し、VBに近づけます。 > 少し、順番を変えてわかりやすく。 > UINT i; > UINT nStrLen = 0; > UINT nNum = uID & 15; // 下位4ビットマスク -> 16で割った余り > // VB だと uID mod 15 > for (i = 0; i < nNum; i++) { > nStrLen = lpwsz[0]; // 先頭2バイト読み込み > lpwsz = lpwsz + 1; // 文字数データのあった2バイト分ポインタを進める > lpwsz = lpwsz + nStrLen; // 取得した文字数分ポインタを進める > } > nStrLen = lpwsz[0]; // 先頭2バイト読み込み > lpwsz = lpwsz + 1; // 文字数データのあった2バイト分ポインタを進める > // この時点で、目的のIDのデータの、文字数がnStrLenに、 > // 文字へのポインタがlpwszとなっている。
これだと、何とか読めそうな気がします。 でも、今だから言えることかもしれませんが。 それと、書き換え前(MS)のソースは、C++ というこでしょうか?
> 以上、余り人に説明するのがうまくないので、きれいにまとまりませんでしたが、 > 極力考える手順に沿って書いたつもりです。 > わかりましたでしょうか?
解かり易くて納得できる内容でした。夢中で思わぬ夜更かしをしてしまいました。 説明やコメントを見ながら、思わず唸ってしまいました。 他人のソースを読んだだけで、これだけのことがわかるとは凄過ぎです。
> わからないところがあれば、聞いてください。
ありがとうございます。今後共、宜しくお願いいたします。
|