- PR -

VB.NETからのINIファイル読込みについて

1
投稿者投稿内容
BBSハンドル
会議室デビュー日: 2008/08/12
投稿数: 7
投稿日時: 2009-01-22 17:11
お世話になります。
現在、VB.NETにて下記のようなアプリケーションを作成しております。

実行ファイル名:Application.exe
 ※コンソールアプリケーションです。
設定ファイル名:Application.ini

設定ファイルにはデータベースへの接続情報(データソース、ユーザID、暗号化したパスワード)が保存されています。

・コマンドライン引数なし(=EXE単独起動)の場合:
 1.INIファイルの情報を取得
 2.INIファイル情報を使用してデータベースの情報を取得
 3.INIファイル情報を使用してデータベース情報をログ出力
 4.Enterキー押下などのユーザ操作によりアプリケーション終了

・コマンドライン引数あり(=別に作成したバッチファイルから起動)の場合:
 1.コマンドライン引数を取得
 2.INIファイルの情報を取得
 3.INIファイル情報を使用してデータベースの情報を取得
 4.コマンドライン引数を使用してデータベース情報をログ出力
 5.呼び出し元のコマンドプロンプトに制御を戻して終了

上記仕様を同時に満たすコンソールアプリケーションを作成したのですが、「コマンドライン引数あり」の場合に暗号化したパスワードを取得できずに「Base-64 文字列に無効な文字が含まれています。」というエラーで落ちてしまいます。
デバッグしてみたところ、「コマンドライン引数あり」の場合のみINIファイルのキー値を格納するString型変数で値を受け取れていない事がわかりました。
単独起動では全く問題ないので修正点がわからない状態で困っております。
よろしくお願い致します。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2009-01-22 17:28
引用:

BBSハンドルさんの書き込み (2009-01-22 17:11) より:
デバッグしてみたところ、「コマンドライン引数あり」の場合のみINIファイルのキー値を格納するString型変数で値を受け取れていない事がわかりました。
単独起動では全く問題ないので修正点がわからない状態で困っております。
よろしくお願い致します。



INIファイルの構成はどのようになっていますか?
(セクションやキーの名称は英数字ですか?)

INIファイルの取得はどのように行っていますか?
Windows APIを使用しているのかどうか。Windows APIを使っているなら、
Declare文またはDllImport属性を設定したメソッドはどのように定義しているか?
またその呼び出しを行っている箇所のソースコードはどのように
記述していますか?
BBSハンドル
会議室デビュー日: 2008/08/12
投稿数: 7
投稿日時: 2009-01-22 17:43
引用:
INIファイルの構成はどのようになっていますか?
(セクションやキーの名称は英数字ですか?)
INIファイルの取得はどのように行っていますか?
Windows APIを使用しているのかどうか。Windows APIを使っているなら、
Declare文またはDllImport属性を設定したメソッドはどのように定義しているか?
またその呼び出しを行っている箇所のソースコードはどのように
記述していますか?


回答ありがとうございます。
セクション、キー名ともに英数字です。
また、INIファイルの呼び出しはWindows APIを使用しております。
DLL化してあり、ソースはネットワークに繋いでいないPCにあるためメソッドの定義についての今時点で説明はできません。
呼び出しのソースコードは以下のようになっています。

' パスワードを取得する
Dim passString As System.Text.StringBuilder = New System.Text.StringBuilder(256)
IniFileUtility.GetPrivateProfileString("DataBase", "USERPASS", "パスワード", passString, passString.Capacity, System.IO.Path.GetFullPath("Application.ini"))

DLLのIniFileUtilityクラスのGetPrivateProfileStringメソッドをコールするようになっており、第一引数から、セクション名、キー名、デフォルト値、キー値格納変数、サイズ、INIファイルのパスとなっています。
このpassStringの値を見てみたら、コマンドライン引数ありの場合は"パスワード"となっていたのです。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2009-01-22 18:05
引用:

IniFileUtility.GetPrivateProfileString("DataBase", "USERPASS", "パスワード", passString, passString.Capacity, System.IO.Path.GetFullPath("Application.ini"))


そのバッチファイルってのが Application.exe と異なるディレクトリに存在した場合、大抵の場合 Path.GetFullPath で違うパスを指すことになりますが、その辺大丈夫でしょうか?
Path.GetFullPath は相対パスが与えられた場合カレントディレクトリを元にパスを生成しますので。
BBSハンドル
会議室デビュー日: 2008/08/12
投稿数: 7
投稿日時: 2009-01-23 09:36
Hongliang様
引用:-----------------------------------------------------------------
そのバッチファイルってのが Application.exe と異なるディレクトリに存在した場合、大抵の場合 Path.GetFullPath で違うパスを指すことになりますが、その辺大丈夫でしょうか?
Path.GetFullPath は相対パスが与えられた場合カレントディレクトリを元にパスを生成しますので。

おっしゃる通りです、基本的な事を忘れていました...
呼出し元のバッチファイルが異なるディレクトリに存在している場合への考慮漏れが原因でした。

よねKEN様、Hongliang様 無事解決できました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)