Re[6]: CからVBに変換


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by 今市 on 2001/07/29 05:18:20

In Reply to: Re[5]: CからVBに変換 Posted by Uz on 2001/07/29 00:51:57


    詳細かつ解かり易い解説ありがとうございます。

    文法エラーの部分は、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++ というこでしょうか?

    > 以上、余り人に説明するのがうまくないので、きれいにまとまりませんでしたが、
    > 極力考える手順に沿って書いたつもりです。
    > わかりましたでしょうか?

    解かり易くて納得できる内容でした。夢中で思わぬ夜更かしをしてしまいました。
    説明やコメントを見ながら、思わず唸ってしまいました。
    他人のソースを読んだだけで、これだけのことがわかるとは凄過ぎです。

    > わからないところがあれば、聞いてください。

    ありがとうございます。今後共、宜しくお願いいたします。


記事スレッド一覧