tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル又 iniFileですが
記事No11818
投稿日: 2008/03/18(Tue) 17:34
投稿者窓側ni
同じ日に似たような質問を失礼します。

コンボボックスから入力された値(文字列)をフォームを閉じるときにiniFileへ書き込んで保存を試みようとしましたが、エラーは出ないのですが、iniFileへは書き込んではくれません。
下記のように記述しております。↓

'API
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _
    "WritePrivateProfileStringA" ( _
        ByVal lpApplicationName As String, _
        ByVal lpKeyName As Any, _
        ByVal lpString As Any, _
        ByVal lpFileName As String) As Long

'フォーム閉じる
Private Sub Form_Unload(Cancel As Integer)

Call WritePrivateProfileString("FileSearch", "Ext",cmbExt.Text, "c:\FileSearch.ini")

End Sub

[ツリー表示へ]
タイトルRe: 又 iniFileですが
記事No11819
投稿日: 2008/03/18(Tue) 17:56
投稿者花ちゃん
> iniFileへは書き込んではくれません。

そのままで、試した限りでは、書き込まれていますが。

cmbExt.Text が空という事はないですか?
又は、投稿されたコードと実際のコードが違うとか。

[ツリー表示へ]
タイトルRe^2: 又 iniFileですが
記事No11820
投稿日: 2008/03/18(Tue) 18:11
投稿者窓側ni
花ちゃんさん、
レス有り難うございます。
そのままで、試した限りでは、書き込まれているということはコード自体に問題は無いのでしょうか?
cmbExt.Textが空というのは何も入力された状態ではないと取っていいでしょうか?
もしそうであればコンボボックスにtxtという文字列を入れているのと、試みるときは別の文字列を入力しております。
申し遅れましたが当方初心者ですが、質問ばかりで申し訳ないです。

[ツリー表示へ]
タイトルRe^3: 又 iniFileですが
記事No11821
投稿日: 2008/03/18(Tue) 19:04
投稿者るしぇ
戻り値をチェックすべきでしょう。
失敗してるなら、ファイルを開いてロックしてるとか?

[ツリー表示へ]
タイトルRe^3: 又 iniFileですが
記事No11824
投稿日: 2008/03/19(Wed) 10:58
投稿者いな
> cmbExt.Textが空というのは何も入力された状態ではないと取っていいでしょうか?

何も入力されていない状態というよりかは、
コードで書くならば、

If cmbExt.Text = vbNullstring Then
    MsgBox "cmbExt.Textが空です。"   '★
Else
    MsgBox "cmbExt.Textが空ではありません。"
End If
★の場合、"c:\FileSearch.ini"の中の"FileSearch"セクションの "Ext"キーは
[FileSearch]
Ext=
とはならず、キーごとINIファイルから、削除されます。

#この動作を書き込まれないと言っているのであれば、
#特に読み出し時にも問題はないので、これは仕様ではないでしょうか?
#っとかってな妄想も含め、レスしてみました。

[ツリー表示へ]
タイトルRe^4: 又 iniFileですが
記事No11825
投稿日: 2008/03/19(Wed) 12:14
投稿者窓側ni
るしぇさん、いなさん、
レス有り難うございます。

現状はiniFileに"キー"の"値"に書き込まれない、"キー"自体も削除されないという
変化がない状態です。
仕様の可能性があるかもしれないので調べてみます。

私的にはiniFileに書き込むことに対しての他にコードが必要なのかと考えておりました。

Private Declare Function WritePrivateProfileStringで宣言し、

Call WritePrivateProfileString("セクション名", "キー名", 取得する所, "iniFile名")

だけで機能するのでしょうか?

[ツリー表示へ]
タイトルRe^5: 又 iniFileですが
記事No11826
投稿日: 2008/03/19(Wed) 12:32
投稿者魔界の仮面弁士
> 私的にはiniFileに書き込むことに対しての他にコードが必要なのかと考えておりました。
特に必要無いですよ。

強いて言えば、書き込み結果をすぐに反映させるために、最初の 3 つの引数を空にして
ライトキャッシュをフラッシュする処理が必要になる場合も稀にありますが、
通常の運用であれば、気にしなくても良いかと。

> Call WritePrivateProfileString("セクション名", "キー名", 取得する所, "iniFile名")
あれ?
最初の質問では、
> "c:\FileSearch.ini"
でしたが、今度は
> "iniFile名"
になっていますね。どちらの構文をお使いですか?

それと、実行させている OS は Vista ですか? XP ですか?
また、書き込んだ後、GetPrivateProfileString で値を取得する事はできていますか?

[ツリー表示へ]
タイトルRe^6: 又 iniFileですが
記事No11829
投稿日: 2008/03/19(Wed) 13:14
投稿者窓側ni
魔界の仮面弁士さん、
レス有り難うございます。

> Call WritePrivateProfileString("セクション名", "キー名", 取得する所, "iniFile名")
なんですが、iniFile名 = c:\FileSearchという意味で書きました。
解りにくくてすみません。

実行させているOSはXPです。
デバッグで確認しました所、取得しているのは、読み込み時のみで書き込みの際は、GetPrivateProfileStringでは値は取得しておりません。
WritePrivateProfileStringを使用しているのですが、GetPrivateProfileStringも使用しなければならないでしょうか?

[ツリー表示へ]
タイトルRe^7: 又 iniFileですが
記事No11830
投稿日: 2008/03/19(Wed) 13:23
投稿者魔界の仮面弁士
> デバッグで確認しました所、取得しているのは、読み込み時のみで書き込みの際は、GetPrivateProfileStringでは値は取得しておりません。
それで OK です。

> WritePrivateProfileStringを使用しているのですが、GetPrivateProfileStringも使用しなければならないでしょうか?
不要です。

iniファイルの書き込み検証を、c:\FileSearch.ini をメモ帳で開いて確認しているのか、
それとも、GetPrivateProfileString で確認しているのかが分からなかったので、
その両方で検証してみてください、という意図です。

特定の条件を満たしている場合、ini への書き込み結果は、ファイルに対してではなく、
レジストリに対して行われる可能性があるので…。


それから、アプリをタスク スケジュール等のサービスから起動している場合、
その exe の実行ユーザに対して、ini ファイルへの書き込み可能権限が
与えられているかどうかもチェックしておいてください。

[ツリー表示へ]
タイトルRe^8: 又 iniFileですが
記事No11831
投稿日: 2008/03/19(Wed) 14:09
投稿者窓側ni
魔界の仮面弁士さん、
レス有り難うございます。

> その exe の実行ユーザに対して、ini ファイルへの書き込み可能権限が
> 与えられているかどうかもチェックしておいてください。

申しわけありません、チェックしたいのですが、書き込み可能権限はどこで確認できるのでしょうか?

当方まだ初心者で把握していない部分が多々あります。
お手数おかけします。

[ツリー表示へ]
タイトルRe^9: 又 iniFileですが
記事No11833
投稿日: 2008/03/19(Wed) 14:46
投稿者魔界の仮面弁士
> 書き込み可能権限はどこで確認できるのでしょうか?

XP Pro なら、ファイルのプロパティの[セキュリティ]タブです。

[ツリー表示へ]
タイトルRe^10: 又 iniFileですが
記事No11835
投稿日: 2008/03/19(Wed) 15:15
投稿者窓側ni
魔界の仮面弁士さん、
レス有り難うございます。

> XP Pro なら、ファイルのプロパティの[セキュリティ]タブです。
確認しましたが、読み書き全て許可になっておりました。

[ツリー表示へ]
タイトルRe^5: 又 iniFileですが
記事No11840
投稿日: 2008/03/20(Thu) 00:51
投稿者Starfish
 戻り値はチェックしましたか?

 何のエラーが返ってくるかを調べるのが、解決が一番早いです。

 エラーをチェックして、エラーの内容をメッセージボックスに
表示します。デバッグ用に以下の処理を追加してみてください。

’API宣言追加
Private Declare Function FormatMessage Lib "kernel32.dll" _
        Alias "FormatMessageA" _
        (ByVal dwFlags As Long, _
        lpSource As Any, _
        ByVal dwMessageId As Long, _
        ByVal dwLanguageId As Long, _
        ByVal lpBuffer As String, _
        ByVal nSize As Long, _
        Arguments As Long) As Long
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const PROCESS_DEFAULT_LANGUAGE = &H400

' INIファイル書き込み
Dim lngReturnValue As Long
Dim strErrorMessage As String

    lngReturnValue = WritePrivateProfileString("FileSearch", "Ext", cmbExt.Text, "c:\FileSearch.ini")
    ' エラーチェック
    If lngReturnValue = 0 Then
        strErrorMessage = Space(256)
        lngReturnValue = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, ByVal vbNullString, Err.LastDllError, PROCESS_DEFAULT_LANGUAGE, strErrorMessage, Len(strErrorMessage), ByVal 0)
        MsgBox strErrorMessage
    End If

[ツリー表示へ]