トップページ⇒prog
21コメント8KB

NTでINIファイルって...

■ このスレッドは過去ログ倉庫に格納されています
0001仕様書無しさんNGNG
VBの話なんだけど、APIの「GetPrivateProfileString」関数を
使ってINIファイルを読み込むとき、
Windows9X系なら問題なく実行できるけど、
NTではワトソン博士が起動してアプリケーションエラーだって
起こられるのよ。どうしたら回避できるのな?
0002仕様書無しさんNGNG
>>1
9x系では出てこなかった潜在的バグで、バッファーが足りないとかなんじゃない?
0003仕様書無しさんNGNG
プログラム板逝け。
0004仕様書無しさんNGNG
え?自分、ずいぶん長いことNTでVBでGetPrivateProfileString使ってるけど、そんなエラー
出たことないよ?
環境を詳しく教えて。
00051NGNG
OSはWinNT4.0WKで、SP6aを当てているかな。
BASモジュールで「GetPrivateProfileString」をDeclareして、
Formモジュール内で利用するだけなんだよね。

ちなみに他のNTマシンで実行しても「エラー」って怒られて...。
98SEでは問題なく処理が通るんだ。
Microsoftのサポート情報で調べてもわからなかった。
よし、VBの再インストールしてみよっかな。

0006仕様書無しさんNGNG
呼び出すとき、値を代入する文字列は固定長にしてるよね?
00071NGNG
>6

Dim str As String * 255

「* 255」を値代入の変数宣言時に付加したら動きました!
GetProfile〜関数の5番目のnsizeにサイズを指定するだけ
では駄目なんですね。
どうもありがとうございます!
0008仕様書無しさんNGNG
>>7
>GetProfile〜関数の5番目のnsizeにサイズを指定するだけ
その指定したサイズと同じ長さの文字列を渡してやんないとダメ、ってことね。
ついでに、呼び出す前に文字列の初期化をしておくことをお勧めする。
0009仕様書無しさんNGNG
すいません
似たような質問なんで、此処に書かせていただきます

label1.forecolorをiniに保存して、次に読み込むとき、今一つ上手く行かないんです
何の関数でiniに書き込んで、何の関数でiniから読み込めば良いのでしょうか

宜しく御願いします
0010仕様書無しさんNGNG
>>9
一、名前くらい付けれ
一、関数すら自分で調べられないのかや?
0011仕様書無しさんNGNG
>>9
forecolorはLong型の整数値で保存するんですね?

整数値はGetPrivateProfileInt()で取得できます。戻り値がそのまま
取得した値になります。関数名はIntですが戻り値はLongです。
0012仕様書無しさんNGNG
>>11
ええ、書き込んで取得は出来るんです
書き込んだときに、「16777215」辺りの数字がiniにあるんですが、
これ、このままほり込むとエラーになってしまうんですよ
それで、質問した次第です
001311NGNG
>>12
>ええ、書き込んで取得は出来るんです
ってことは、GetPrivateProfileInt()関数で変数に取り込むまでは
出来ていて、
>これ、このままほり込むとエラーになってしまうんですよ
それをまたForecolorプロパティに代入するとエラーになる、という
ことですか?

それとも、変数を使わず、直接Forecolorプロパティを使って書込/
読込をしてるんですか?もうちょっと詳しく教えていただけませんか?
0014仕様書無しさんNGNG
>>11さん
>>ええ、書き込んで取得は出来るんです
>ってことは、GetPrivateProfileInt()関数で変数に取り込むまでは
>出来ていて、
>>これ、このままほり込むとエラーになってしまうんですよ
>それをまたForecolorプロパティに代入するとエラーになる、という
>ことですか?

そのとおりです

StrBuf = Format$r(lblTimer.ForeColor)
Ret = WritePrivateProfileString("Timer", "lblTimer_FontForeColor", StrBuf, IniPath)
StrBuf = Format$(lblTimer.BackColor)
Ret = WritePrivateProfileString("Timerr", "lblTimer_FontBackColor", StrBuf, IniPath)

でiniには16777215か、似たような数字が書き込まれます
それを

Ret = GetPrivateProfileString("Timerr", "lblTimer_ForeColor", "&H80000012", StrBuf, 100, IniPath)
lblTimer.ForeColor = StrBuf
Ret = GetPrivateProfileString("Timer", "lblTimer_BackColor", "&H8000000E", StrBuf, 100, IniPath)
lblTimer.BackColor = StrBuf
と
lblTimer.ForeColor = GetPrivateProfileInt("Timer", "lblTimer_ForeColor", &H80000012, IniPath)
lblTimer.BackColor = GetPrivateProfileInt("Timer", "lblTimer_BackColor", &H8000000E, IniPath)
の二種類で確かめて未たんですけど、それでも上手く行かないんです
00159NGNG
長かったですね・・・すいません

あと、「未たん」>「見たん」です
すいません
001611NGNG
>>14=9さん
僭越ながら添削させて頂きます。

まず、基本的なこと。
書き込むときと取得するときのキーの名称が違ってますよ。
Put〜関数ではlblTimer_FontForeColor
Get〜関数ではlblTimer_ForeColor
になってますね。これじゃ、いつになっても取得はできません(笑)

あと気づいたことですが、GetPrivateProfileString()のパターン。
取得した値は文字列型ですよね。それを直接Colorプロパティに代入しても、
Colorの値は整数値ですから「型が違います」エラーになって終わりです。
StrBufを整数値に変換しましょう。

頑張ってね。
00179NGNG
>>11さん
変数名の違いは気付きませんでした
鬱です

あと、アドバイス、ありがとう御座いました
00189NGNG
>>11さん

Ret = GetPrivateProfileString("WatchMaker", "lblTimer_ForeColor", "&H80000012", StrBuf, 100, IniPath)
lblTimer.ForeColor = CLng(StrBuf)
Ret = GetPrivateProfileString("WatchMaker", "lblTimer_BackColor", "&H8000000E", StrBuf, 100, IniPath)
lblTimer.BackColor = CLng(StrBuf)

って事で解決しました
お世話をお掛けしました
0019仕様書無しさんNGNG
ショボイ・・・
0020仕様書無しさんNGNG
VBさいこー
0021仕様書無しさんNGNG
Win98はUNICODEを使うとチンコくさくなります。
■ このスレッドは過去ログ倉庫に格納されています