INIファイルのことなんですが・・・

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
麒麟

INIファイルのことなんですが・・・

#1 投稿記事 by 麒麟 »

WritePrivateProfileString("TEST", "key1", TESTTEXT, "./test.ini")
(TESTTEXTは文字列です。)

INIファイル名を"./test.ini"というように指定しているのですが、
(これがよくないのだと思います。)
ファイルを開くなどで、カレントディレクトリ(?)が変わると
想定外のところに保存されます。
改善策を教えてください。

一応、実行ファイルのあるディレクトリを調べて、それに"./test.ini"を
加える方法を思いついたのですが、やり方がわかりませんでした。
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#2 投稿記事 by Toshi »

WritePrivateProfileString は、絶対パスを渡さないと
Windows のフォルダにファイルを作成するので、
実行ファイルのあるフォルダの絶対パスを取得することになります。

コード: 全て選択


Dim INI[MAX_PATH] As Byte
GetModuleFileName(GetModuleHandle(NULL),INI,MAX_PATH)
lstrcpy(INI+lstrlen(INI)-3,"ini")

こうすると INI には実行ファイルの名前の拡張子を "ini" にしたものが入ります。
ゲスト

#3 投稿記事 by ゲスト »

> WritePrivateProfileString は、絶対パスを渡さないと
> Windows のフォルダにファイルを作成するので、
> 実行ファイルのあるフォルダの絶対パスを取得することになります。
>
>

コード: 全て選択


> Dim INI[MAX_PATH] As Byte
> GetModuleFileName(GetModuleHandle(NULL),INI,MAX_PATH)
> lstrcpy(INI+lstrlen(INI)-3,"ini")
> 
> 
>
> こうすると INI には実行ファイルの名前の拡張子を "ini" にしたものが入ります。

なるほど。こういうやり方がありましたか・・・
でも、この方法だと、実行ファイルと同じ名前の INI しか扱えませんよね?
出来れば、実行ファイルと違う名前のものも扱えるようなやり方がよいのですが・・・
麒麟

#4 投稿記事 by 麒麟 »

すいません、名前書き忘れてました。↑は私です。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

PathRemoveFileSpecというパスから末尾のファイル名部分を取り除く関数がありますのでこれを使えばできます。

コード: 全て選択

Declare Function PathRemoveFileSpec Lib "shlwapi.dll" _
	Alias "PathRemoveFileSpecA" (pszPath As *Char) As Long

コード: 全て選択

Dim ModulePath[MAX_PATH] As Char
If GetModuleFileName(0, ModulePath, MAX_PATH) = 0 Then
	' エラー
End If

If PathRemoveFileSpec(ModulePath) = FALSE Then
	' エラー
End If
EXEのパスが"C:\Foo\Bar.exe"ならばこのコードを実行すると
ModulePathには"C:\Foo"が格納されています。

ここにhoge.iniを保存したければ,MakeStr(ModulePath) & "\hoge.ini"とすれば"C:\Foo\hoge.ini"となります。
ModulePathを使いまわす気がなければ,
変数ModulePathをIniファイルへのパスだということを示す適切な変数名にした上で,
直接lstrcpyで書き込んでしまっても良いでしょう。
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#6 投稿記事 by Toshi »

でしたら

コード: 全て選択


Dim INI[MAX_PATH] As Byte 
Dim Drive[2] As Byte
Dim Path[MAX_PATH] As Byte
GetModuleFileName(GetModuleHandle(NULL),INI,MAX_PATH) 
_splitpath(INI,Drive,Path,NULL,NULL)
lstrcpy(INI,Drive)
lstrcat(INI,Path)

これで INI に実行ファイルのあるフォルダの絶対パスが入ると思います。

書き込んだ瞬間に先を越されました。。。
麒麟

#7 投稿記事 by 麒麟 »

>イグトランス 様
>Toshi 様

ありがとうございます。
おかげ様で、問題は解決できました。
返信する