none
VB6.0 iniファイル読込みでパスがうまく取れない RRS feed

  • 質問

  • iniファイルに保存先のパスを記述し、プログラム起動時にパスを取得するプログラムがあります。

    left$を使用してパスの必要部分だけを取得しようとしたのですが

    2バイト文字が入る場合、正常に取得する事が出来ませんでした。

     

    例>

    【iniファイル内】

    KEY_OpenHtml=Z:/work/テスト

    【実行時の値】

    Z:/work/テスト・・・

    ・は16進でコード01、画面に表示させても表示しない

    (null文字?ウォッチウィンドウだと・と表示される)

     

    2バイトの文字数分コード01の文字が付加してしまい、正常なパスを取得する事が出来ません。

    原因わかる方いらっしゃいましたらご指南ください。

    よろしくお願いします。

     

    【環境】

    win XP

    VB6.0 SP5

     

    【プログラム抜粋】

    ' パス取得部分

    ’KEY_OpenHtmlがパス記述

    Sub GetPath()
       
        Dim lenProfile As Long
        Dim lpApplicationName As String, lpReturnedString As String * 1024, nSize As Long, lpFileName As String
       
        nSize = 1024

        lenProfile = GetPrivateProfileString(gTempSystemID, KEY_OpenHtml, "", lpReturnedString, nSize, gIniFileName)
        gTempOpenHtml = Left$(lpReturnedString, lenProfile)

    End Sub

     

    ↑例>の値を実行した場合は

    lenProfile=11

    lpReturnedString=Z:/work/テスト・・・・・・・・・・(01コードが255まで続く)

    でした(ウォッチウィンドウにて)

    2008年7月4日 7:02

回答

  •  ちっぱー さんからの引用

    iniファイルに保存先のパスを記述し、プログラム起動時にパスを取得するプログラムがあります。

    left$を使用してパスの必要部分だけを取得しようとしたのですが

    2バイト文字が入る場合、正常に取得する事が出来ませんでした。

    GetPrivateProfileString(正確にはGetPrivateProfileStringA)はバイト単位で取得した長さを返します。

    対して、Left関数は文字数単位(1バイト文字も、2バイト文字も同じ1文字と数える)で処理します。

    そのずれによって、余分に取り出そうとしてしまい、よく分からないバイトコードが出ているのでしょう。

     

    VB6だったら、LeftB関数とかですかね?

    手元に環境がないので試せませんが。。。

    2008年7月4日 14:12
    モデレータ
  • vbNullChar のところで一旦切っておいた方がいいですね。

     

    2008年7月4日 19:06

すべての返信

  •  ちっぱー さんからの引用

    iniファイルに保存先のパスを記述し、プログラム起動時にパスを取得するプログラムがあります。

    left$を使用してパスの必要部分だけを取得しようとしたのですが

    2バイト文字が入る場合、正常に取得する事が出来ませんでした。

    GetPrivateProfileString(正確にはGetPrivateProfileStringA)はバイト単位で取得した長さを返します。

    対して、Left関数は文字数単位(1バイト文字も、2バイト文字も同じ1文字と数える)で処理します。

    そのずれによって、余分に取り出そうとしてしまい、よく分からないバイトコードが出ているのでしょう。

     

    VB6だったら、LeftB関数とかですかね?

    手元に環境がないので試せませんが。。。

    2008年7月4日 14:12
    モデレータ
  • vbNullChar のところで一旦切っておいた方がいいですね。

     

    2008年7月4日 19:06
  • >Azuleanさん
    GetPrivateProfileStringで取得した値はバイト単位ではなく文字数単位です。
    「KEY_OpenHtml=Z:/work/テスト」と記述していた場合、11が帰ってきています。
    (参照 http://msdn.microsoft.com/ja-jp/library/cc429779.aspx

    その11を元に
    left関数使用・・・「Z:/work/テスト・・・」
    leftB関数使用・・・「Z:/wor」
    となってしまいました。
    VB6.0では文字列は内部的に2バイトで保持しているためか、leftBでは1バイト文字も強制2バイト換算してしまうようです。

     

    >じゃんぬねっとさん
    コメントをみてもピンと来なかったので検索を実施してみると
    http://www.mb.ccnw.ne.jp/garger-studio/vbgame/163.html
    ここを見つけました。

    プログラムを
    gTempOpenHtml = Left$(lpReturnedString, InStr(1,lpReturnedString,vbNullChar)-1))
    と1行修正したら理想の値を取得する事が出来ました。

     

     

    お二方とも、ありがとうございました。

    2008年7月7日 2:32
  •  ちっぱー さんからの引用

    >Azuleanさん
    GetPrivateProfileStringで取得した値はバイト単位ではなく文字数単位です。

    失礼しました。文字数を数えずにぱっと見て判断してすみません。

    Wで終わる方を呼び出されていたのですね。

     

    参考

    Aで終わる方はchar(バイト)単位で数えられるタイプ、Wで終わる方はwchar_t(Unicodeでの16bit文字)単位で数えられるタイプです。

    いずれも1が返ってきたからと言って表示上の1文字とは限りません。前者は2バイト文字、後者は2個のwchar_tで表現する文字等があります。

    「文字単位で返す」というのは額面通り受け取ってはいけません…。

    2008年7月7日 13:56
    モデレータ