C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

iniファイル読み込みについて


(過去ログ 4 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■4477 / inTopicNo.1)  iniファイル読み込みについて
  
□投稿者/ にの 二等兵(10回)-(2006/06/22(Thu) 11:16:39)

分類:[VB.NET] 


分類:[VB.NET] 

いつもお世話になっております。

開発環境
 WindowsXp
 Visual Studio 2005

iniファイル読み込みについて質問があります。

Public Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Integer, _
ByVal inifilename As String) As Integer

Const IniName = "C:\SPLIT\Sys.ini"
Const SecName = "INI_PARAM"
Const KeyName = "INPUT_PATH"
Const De_fault = "not found"


Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Dim ret As String

ret = ReadIniStr(IniName, SecName, KeyName, De_fault)
If ret = De_fault Then
MsgBox("データパスが存在しませんでした。")
End If
Debug.WriteLine("ret = ", ret)
DirectryDri.Path = ret

End Sub

Public Function ReadIniStr(ByVal strFileIni As String, _
ByVal strSectName As String, _
ByVal strKeyName As String, _
ByVal strDefault As String) As String
Dim lngRtn As Integer
Dim strRtn As String

strRtn = Space(256) ・・・★
lngRtn = GetPrivateProfileString(strSectName, strKeyName, _
strDefault, strRtn, 255, strFileIni)

If lngRtn > 0 Then
ReadIniStr = strRtn
Else
ReadIniStr = strDefault
End If

End Function

このような形でiniファイルの文字列を読み込んできているのですが、
★印の部分でスペースでバッファを確保すると、
読み込んだ時にstrRtnの変数の最後に『"(ダブルクォーテーション)』が、
入らないんですが、何か良い方法はございませんか?
よろしくお願いします。

0
引用返信 編集キー/
■4478 / inTopicNo.2)  Re[1]: iniファイル読み込みについて
□投稿者/ にの 二等兵(13回)-(2006/06/22(Thu) 11:31:27)

分類:[VB.NET] 

自力で解決しました。
コードを以下にしめします。

If lngRtn = 0 Then
ReadIniStr = strDefault
Else
★ReadIniStr = Microsoft.VisualBasic.Left(strRtn, lngRtn)
End If

If分の★の部分を変更することで、解決しました。
どうもお騒がせ致しました。


解決済み
引用返信 編集キー/
■4479 / inTopicNo.3)  Re[2]: iniファイル読み込みについて
□投稿者/ Blue 伍長(49回)-(2006/06/22(Thu) 11:37:42)

分類:[VB.NET] 

lngRtnの値を使うのはどうかと思います。
GetPrivateProfileStringの戻り値は格納した「Shift_JISコードでのバイト数」ですので、
「文字数」とは違います。

VB6のときでしたら、終端文字と呼ばれる文字(vbNullChar)を探して(InStr)、
Left関数をつかって切り出しましたが、VB.NETはどうなのかよくわかりません。

# GetPrivateProfileStringAではなくGetPrivateProfileStringW
# ならば、戻り値は文字数ですけど。(引数が違ってくる)

0
引用返信 編集キー/
■4482 / inTopicNo.4)  Re[3]: iniファイル読み込みについて
□投稿者/ にの 二等兵(14回)-(2006/06/22(Thu) 12:52:37)

分類:[VB.NET] 

返信ありがとうございます。

調べてみた結果、Blueさんのおっしゃられている通り、
GetPrivateProfileStringの戻り値は「Shift_JISコードのバイト数」でした。
ありがとうございました。
以下のようにコードを変更しました。

If lngRtn = 0 Then
ReadIniStr = strDefault
Else
count = Strings.InStr(strRtn, vbNullChar)
ReadIniStr = Microsoft.VisualBasic.Left(strRtn, count - 1)
End If

今後とも宜しくお願いします。

解決済み
引用返信 編集キー/
■4483 / inTopicNo.5)  Re[4]: iniファイル読み込みについて
□投稿者/ Blue 伍長(50回)-(2006/06/22(Thu) 13:10:34)

分類:[VB.NET] 

StringBuilderクラスを使うと便利らしいです。

類似スレ
http://homepage1.nifty.com/MADIA/vb/vb_bbs/200410_04100020.html

ちなみに、.NETではINIファイルよりもXMLを使うのが一般的です。

解決済み
引用返信 編集キー/
■4484 / inTopicNo.6)  Re[4]: iniファイル読み込みについて
□投稿者/ まどか 中尉(147回)-(2006/06/22(Thu) 13:38:04)

分類:[VB.NET] 

> count = Strings.InStr(strRtn, vbNullChar)
> ReadIniStr = Microsoft.VisualBasic.Left(strRtn, count - 1)

なるべくMicrosoft.VisualBasicを使わないということでは

Dim NullPos As Integer = strRtn.IndexOf(vbNullChar)
If NullPos > -1 Then
ReadIniStr = strRtn.SubString(0, NullPos)
Else
ReadIniStr = strRtn
End If

としたほうが良いかも。

解決済み
引用返信 編集キー/
■4487 / inTopicNo.7)  Re[5]: iniファイル読み込みについて
□投稿者/ にの 二等兵(15回)-(2006/06/22(Thu) 14:52:59)

分類:[VB.NET] 

返信ありがとうございます。

StringBuilderクラスを使用し、コードを変更しました。
StringBuilderクラスを使用すると、String変換ができてきて、多少面倒ですが、
知識が増えましたので、大変感謝しています。
以下にコードを記します。

Public Function ReadIniStr(ByVal strFileIni As String, ByVal strSectName As String, _
ByVal strKeyName As String, ByVal strDefault As String) _
As String
Dim lngRtn As UInt32
Dim strRtn As StringBuilder = New StringBuilder(256)

lngRtn = GetPrivateProfileString(strSectName, strKeyName, strDefault, strRtn, _
Convert.ToUInt32(strRtn.Capacity), strFileIni)

Dim newStrRtn As String
newStrRtn = strRtn.ToString

Dim NullPos As Integer = newStrRtn.IndexOf(vbNullChar)

If NullPos > -1 Then
ReadIniStr = newStrRtn.Substring(0, NullPos)
Else
ReadIniStr = newStrRtn
End If
End Function

Microsoft.VisualBasicもなるべく使用しないようにします。
ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -