iniファイルの読み込ませ方 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 はなわ  (社会人) 投稿日時 2009/7/13 04:17:06
魔界の仮面弁士さんレスありがとうございます。
宣言部分を直してみました。integerも止めて、UInt32にしました。

Declare Auto Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileString" ( _
<MarshalAs(UnmanagedType.LPTStr)> ByVal lpApplicationName As String, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal lpKeyName As String, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal lpDefault As String, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal lpReturnedString As StringBuilder, _
                                  ByVal nSize As UInt32, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal lpFileName As String) As UInt32

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/7/13 00:05:03
> 関数の宣言部分が間違っていたみたいです。
まだ間違っています。先に示した記事をもう一度読んでみてください。

http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html


> 最後のLongをintegerに直せばいいんですよね。
修正すべき個所は、そこだけではありませんよ。
投稿者 はなわ  (社会人) 投稿日時 2009/7/12 22:11:14
neptuneさんレスありがとうございます。
最後のLongをintegerに直せばいいんですよね。

まだプログラミングを始めて2ヶ月程度で、ネットでサンプルコードを見て勉強しているので、
これからVB6のサンプルコードを参考にするときには、注意したいと思います。
投稿者 neptune  (社会人) 投稿日時 2009/7/12 08:37:51
VB2008ExpressEditonなんですよね?
まだ、データ型が違いますよ。今は偶然問題ないかもしれませんけど
これはまずいと思います。

データ型
http://msdn.microsoft.com/ja-jp/library/dd297710.aspx
GetPrivateProfileString関数
http://msdn.microsoft.com/ja-jp/library/cc429779.aspx

DWORDはダブルワード (4 バイト) です。
投稿者 はなわ  (社会人) 投稿日時 2009/7/12 05:53:39
daiveさん、魔界の仮面弁士さんレスありがとうございます。
無事読み込めるようになりました。

なかなか原因が分からなかったのですが、関数の宣言部分が間違っていたみたいです。
Declare Auto Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, _
                                  ByVal lpKeyName As String, _
                                  ByVal lpDefault As String, _
                                  ByVal lpReturnedString As System.Text.StringBuilder, _
                                  ByVal nSize As Long, _
                                  ByVal lpFileName As String) As Long
のnSizeの型をIntegerにしたら、あっさり読み込めるようになりました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/7/12 01:46:34
> GetPrivateProfileStringA
~A (ANSI)版では無く、~W (Unicode)版を使うことをお奨めします。


Windows 98 や Me には、W版が無く、A版しか実装されていませんでした。
そのため、VB6 時代は(9x系をサポートする必要があるため)A版が多用されていました。

しかし NT/2000/XP/Vista/2003/2008 は、W と A の両方が実装されています。
しかも A 版は、 W 版を文字コード変換することで実装されているため、W 版に比べて
パフォーマンス面で劣ります。

このような事情から、VB.NET では (A版ではなく)W版の利用が推奨されます。
なお、API 宣言を Auto 指定にすると、OS に応じて A と W のどちらかを使うかが
自動的に調整されます。


なお、GetPrivateProfileStringA/W の呼び分け方については、下記の資料が参考になるかと思います。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html


> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\のAeDebug
> というセクションを読みに行ってしまいます。
この質問を見たときは、IniFileMapping の話かと勘違いしてしまいましたが、
今回は AeDebug セクションの話なのですね。

AeDebug は、アプリケーション・エラー発生時におけるデバッガの動作を規定するためのエントリです。

ということで、まずはアプリケーションエラーが発生していないかを確認してみてください。
その上で、もしもアプリケーションエラーが発生しているなら、どこでそのエラーが
発生しているのかを追跡し、その原因を取り除いてみてください。
投稿者 daive  (社会人) 投稿日時 2009/7/11 08:33:25
MSDN:Visual Studio 2005
INI ファイルと構成ファイルの読み書き
http://msdn.microsoft.com/ja-jp/library/cc440869.aspx

VS2005用なので、そのまま使えるかもしれません。

検索ワード:INI ファイル
http://www.google.co.jp/search?hl=ja&q=INI+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&lr=lang_ja

OS依存機能の場合、御使いのWindowsの種類も記入されると
回答が付きやすくなります。

投稿者 はなわ  (社会人) 投稿日時 2009/7/11 05:50:50
VB2008ExpressEditonを使っています。
WIN APIのGetPrivateProfileStringAを使って、初期設定ファイルを読み込ませようと
しているのですが、うまく出来ません。
存在するiniファイル名とセクション名を指定しても、なぜかレジストリの
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\のAeDebugというセクションを読みに行ってしまいます。
考えられる原因と、対処方法を教えてください。