[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/08/23(Tue) 14:55
投稿者名:三宅
URL :
タイトル:
GetPrivateProfileStringが取得できない
こんにちは、宜しくお願いします。

vb6.0環境で

GetPrivateProfileStringで以下の様に指定しても文字列が取得できません。

MainName = "drivers"
KeyName = "wave"
IniPath = "C:\WINDOWS\system.ini"

sWork = String(256, Chr(0))
Leng = Len(sWork)
i = GetPrivateProfileString(MainName, KeyName, "a", sWork, Leng, IniPath)

iniファイルにはセクションとキーが存在するのですが。。。

投稿時間:2005/08/23(Tue) 15:50
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: GetPrivateProfileStringが取得できない
ここの[当サイト内・外の検索]から[関数名]をキーワードにGoogle等で検索して見て下さい。
そうすれば、サンプルが見つかりますのでそのサンプルと貴方が作ったサンプル
とを見比べるなりして見てください。

又、他のINIファイルで試してどうなのか? とかご自分で確認すべき事は
ご自分でされないと、本当にコードが間違っていないのか? キーが存在するのか?
等は、これを見ている者には解りませんよ。

下記コードをそのまま試して取得できますか?
hhttp://homepage1.nifty.com/MADIA/vb/API/GetPrivateProfileString.htm

投稿時間:2005/08/23(Tue) 16:13
投稿者名:三宅
URL :
タイトル:
Re^2: GetPrivateProfileStringが取得できない
返信ありがとうございます、サンプルと見比べて読み込むことができました。
ありがとうございました。

しかし、読み込んだ文字列の後ろにゴミと思われるものが入ってしまっています。
読み込みで指定したサイズ分強制的に入ってしまうようですが、
これを回避する方法はないでしょうか?

改行までの文字列が取得できれば一番いいのですが。

投稿時間:2005/08/23(Tue) 16:37
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: GetPrivateProfileStringが取得できない
>しかし、読み込んだ文字列の後ろにゴミと思われるものが入ってしまっています。
ここで貴方が入れた sWork = String(256, Chr(0)) Chr(0)=vbNullChar が入って
いるのです。

> 読み込みで指定したサイズ分強制的に入ってしまうようですが、
> これを回避する方法はないでしょうか?

API関数を使用する上では常識の部類になります。

Left$(sWork, InStr(sWork, vbNullChar) - 1)

又、下記のような関数を作って使用するのもいいかと。
hhttp://www.bcap.co.jp/hanafusa/VBHLP/sonota_kansu2.htm#fNullCut

投稿時間:2005/08/23(Tue) 16:46
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: GetPrivateProfileStringが取得できない
> しかし、読み込んだ文字列の後ろにゴミと思われるものが入ってしまっています。
そういうものです。この手の API は、文字列の終端に Chr(0)すなわち「vbNullChar」を
埋め込みますので、それ以前の文字列を取り出すようなコーディングをしてください。

この場合は、以降の文字列をそぎ落とす為に、InStr関数とLeft関数を使う事ができるでしょう。
(あるいは、Split関数を使うような手法もあります)

もしくは、GetPrivateProfileString の場合、戻り値として「書き換えた文字数」を
返しますので、それを利用して必要な部分を切り出す事もできます。

投稿時間:2005/08/24(Wed) 02:14
投稿者名:Blue
Eメール:blue_cave@mail.goo.ne.jp
URL :
タイトル:
Re^4: GetPrivateProfileStringが取得できない
> もしくは、GetPrivateProfileString の場合、戻り値として「書き換えた文字数」を
> 返しますので、それを利用して必要な部分を切り出す事もできます。
正確には、(アスキー文字列の)バイト数になります。

例えば
取得文字列が "ABC"    の場合、戻り値は 3
             "あいう" の場合、戻り値は 6
             "ABあ"   の場合、戻り値は 4
と。

単純にLeftおよびLeftB関数が使えないので面倒です。
StrConvを駆使してやるのかなぁと。
# この処理をするならば、私なら最初からByte型配列で取得するな。

投稿時間:2005/08/24(Wed) 09:39
投稿者名:那岐
Eメール:
URL :
タイトル:
Re^5: GetPrivateProfileStringが取得できない
私は最初の文字列初期化の時にString(必要文字数, Chr(0))ではなく
Space$(必要文字数)にするのが癖になっているのでついつい
Replaceを使ってChr(0)をvbNullStringに置き換えた後にTrim$とか
かけちゃいますけどね。今回の書き方ならReplaceだけでもいいかも。

#私の記述方法は邪道かもしれませんが人それぞれということで。

投稿時間:2005/08/24(Wed) 10:26
投稿者名:三宅
URL :
タイトル:
Re^6: GetPrivateProfileStringが取得できない
みなさんありがとうございます。

解決できました。

APIを使う時は注意が必要なのですね。

ありがとうございました。