電子書籍の厳選無料作品が豊富!

VBを勉強中です。
段階としては書籍やサイトを参考に既存のプログラムを編集しています。

VB6で作られたプログラムのバージョンアップを行う作業で、VB6→VS2005アップグレード完了後、エラー潰し作業(ここでの意見を参考に)後
デバッグを行っています。

.exeと同フォルダに.iniファイルを置き、参照ファイルの所在を記し
スタートアップオブジェクトの apli load イベントにて起動時に
iniを読み込ませたいのですが、うまくいきません。

VB2005では.iniではなく、.xmlでの記述を推奨とのことですが
それが原因なのでしょうか。
ビルドを行うと、.xmlが作成され、iniは作成されませんでした。

ヒントでも構いません、どうぞよろしくお願いします。


スタートアップオブジェクトは以下です。


Private Sub frmapli_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

IniFName = My.Application.Info.DirectoryPath & "\apli.ini"
End Sub



↓------ここからはapli.ini内容------↓

[apli]
MASTER_EXCEL_FILE_J = appli_form_J.xls
MASTER_EXCEL_FILE_E = appli_form_E.xls
MASTER_EXCEL_FILE_DIR =
VERSION_TEXT1 = apli Ver2.1
VERSION_TEXT2 =
VERSION_TEXT3 =
VERSION_TEXT4 =
VERSION_TEXT5 =
VERSION_PICTURE =
HELPFILE =

↑--------------------↑


参照ファイルは同フォルダ内にある以下4つのファイルです。
・apli_form_E.xls
・apli_form_J.xls
・apli.ico
・help.pdf


.iniファイルの下記部分をどう記せば良いのでしょうか。

●MASTER_EXCEL_FILE_DIR =
●VERSION_PICTURE =
●HELPFILE =



又、アップグレード前のVB6作成時での構文は以下でした。

Private Sub Form_Load()

IniFName = App.Path & "\apli.ini"
End Sub

A 回答 (5件)

私も昔ハマったのですが、特にStringを扱うAPIだと、API側と.NETアプリとの間で


変数の調停を勝手に行ってくれたりは しないようです。
(この辺の詳細は、ややこしい&私も完全には理解できていないので
 参考URLを見てください)
マーシャリングという設定をDeclareに記述して、調停方法を指定してやらなければいけません。
VB6までのGetPrivateProfileStringの書き方だと、私が遭遇した現象としては
1回目のAPI呼出だけは成功するけど2回目以降は単純に値の取得が出来ない(エラーにはならない)、
といった感じでした。

時間が無ければ、参考URL内の図8の内容で、APIの定義を書き換えてください。
(時間があれば、全部読むと結構勉強になると思います)
また、取得する文字列はStringBuilderで定義する必要がありますので、
図9を参照してください。

ちなみにXMLでの設定については、My.Settingsを使用して設定を定義すると
実際にはXMLの読み書きになると思います。
(設定の取得・書込みを、かなり簡略化してくれる)
VS2005では、Iniよりこっちの方が数段メジャーですね。

参考URL:http://www5b.biglobe.ne.jp/~yone-ken/VBNET/speci …
    • good
    • 0
この回答へのお礼

参照頂いたサイトを元に、見直すことで解決しました。

F11キーを押してのステップインを使い、変数に
何が入っているかをきちんと確認するべきでした。

どうもありがとうございました

お礼日時:2008/06/24 19:03

>Message="'\\注1ネットワークドライプ名\' が見つかりません。

ファイル名およびファイルの保存場所が正しいかどうか確認してください。

…ん?
もしかして実は「Iniは読めてるけど、その内容または以後の処理に問題があって
エラーになる」ってレベルの話ですかね?
一言で言えば「アプリの仕様を確認してください」って事になっちゃう気も
するのですが、Iniの内容から推測できる部分もあるので、そこだけ。
>MASTER_EXCEL_FILE_J = appli_form_J.xls
>MASTER_EXCEL_FILE_E = appli_form_E.xls
>MASTER_EXCEL_FILE_DIR =
ここから察するに、MASTER_EXCEL_FILE_DIR と、残りの2つを連結して
xlsファイルのフルパスを作成しているのでしょう。
MASTER_EXCEL_FILE_DIR に、該当のxlsファイルが存在するフォルダ
(ディレクトリ:DIR)を設定してみて下さい。
その際、末尾に\が必要かどうかは、まさにアプリの仕様次第ですので
(例えば "C:\Windows" なのか、"C:\Windows\" なのかというレベルの話)、
仕様を確認するか、MASTER_EXCEL_FILE_DIRとMASTER_EXCEL_FILE_J(E)を
連結している部分のソースを調べるか、pro_fl_name に格納されている文字列を
Console.WriteLineとかDebug.Printとかで確認するとかしてみてください。

それ以前の話(本当にIniが読めていない等)でしたら、別途詳細な状況を教えてください。

この回答への補足

見てくださりありがとうございます。apli.iniの内容を書き換えました。


↓------変更後apli.ini内容------↓

[apli]
MASTER_EXCEL_FILE_J = appli_form_J.xls
MASTER_EXCEL_FILE_E = appli_form_E.xls

MASTER_EXCEL_FILE_DIR = C:\bin
VERSION_TEXT1 = apli Ver2.1
VERSION_TEXT2 =
VERSION_TEXT3 =
VERSION_TEXT4 =
VERSION_TEXT5 =
VERSION_PICTURE =
HELPFILE = C:\bin\ヘルプファイル.pdf

↑--------------------↑


C:\binとC:\bin\のどちらでも
該当Excelファイルは読み込まず
ヘルプファイルだけは1度のみ開きましたが何故か二度目からはC:\Windows フォルダが開きました。



pro_fl_nameについてですが、
>pro_fl_name に格納されている文字列を
Console.WriteLineとかDebug.Printとかで確認するとかしてみてください。

この意味を調べてみたのですが、コマンドプロンプトを使用する?
とかで、理解できませんでした。

起動時にチェックが入っているラジオボタンの項目は下記となっておりました。

Private Sub Command4_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command4.Click
'次のメニュ-の表示が選択される
If Option4.Checked = True Then
pro_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_E")
Else
pro_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_J")
End If
pro_fl_name = ReadIni1(IniFName, "apli", "MASTER_EXCEL_FILE_DIR") & "\" & pro_name

plot_fl_name = Trim(Text2.Text)



この場合、下から2行目の"\" & pro_nameの
"\"の部分に問題があるのでしょうか?
上記箇所を全てExcelファイルがあるフォルダパスに変えても
状況は変わりませんでした。

ちなみにVB2005にアップグレード前のVB6作成版では
apli.iniの内容、該当Excelファイルのパスを指定すると
問題なく動作しました。

補足日時:2008/06/23 14:17
    • good
    • 0

ANo.3です。


ANo.4のHayashi_Trekさんへ。
その定義では足りません。
余裕がありましたら、ANo.3の参考URLの中身を読んでみて下さい。
    • good
    • 0

GetPrivateProfileStringやGetPrivateProfileIntの、Declare 宣言に間違いは無いですか?


VB6の場合、Integerは16ビット、Longは32ビットだが
VB.NETでは、Integerは32ビット、Longは64ビットになります。

VB.NETでの宣言は次のようになります。
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
    • good
    • 0

iniファイルを読み込む部分のソースを提示しましょう


また エラーが出ているならそのエラーの詳細も投稿しましょう

WinAPIのGetPrivateProfileString等を使っているなら 引数の型宣言が合致しているか確認しましょう

Excelのシートを操作するようなアプリケーションならComオブジェクトの開放に十分配慮しましょう
VB6時代のコードは暗黙的に参照された物をExcelのオブジェクト参照を破棄した時点で一緒に破棄してくれました
VB.NETではそのような面倒を見てくれません
作成したアプリは終了したが Excelのタスクが残ってしまうといった現象が発生します

たとえば
dim oRng as Excel.Range = oXL.Worksheets("Sheet1").Range("A1")
などとしてしまうとoXL.Worksheets("Sheet1")の参照を開放する術が無くなります

VSTO(Visual Studio Tools for Office)だとこの辺りの対応が多少緩和されます

この回答への補足

情報が足りず申し訳ありませんでした。
redfox63さんのおっしゃるとおり、必ずアプリケーション強制終了後
その都度タスクにExcelが残ります。

すみません、知識不足の為、この部分は理解できませんでした。
>たとえば
>dim oRng as Excel.Range = oXL.Worksheets("Sheet1").Range("A1")
>などとしてしまうとoXL.Worksheets("Sheet1")の参照を開放する術が無くなります

>VSTO(Visual Studio Tools for Office)だとこの辺りの対応が多少緩和されます




エラーが出ている箇所は下記です。

エラーメッセージ
System.Runtime.InteropServices.COMException はハンドルされませんでした。
Message="'\\注1ネットワークドライプ名\' が見つかりません。ファイル名およびファイルの保存場所が正しいかどうか確認してください。

(注1)みつからないとされているパスは、外付けHDDとなっていました。なぜでしょう


Sub make_data_design_data() 'メインツ-ル

' エクセルファイルオープン
Exl = CreateObject("Excel.Application")
ExBook = Exl.Workbooks.Open(pro_fl_name)  ←この行
Exl.DisplayAlerts = False

Exl.ScreenUpdating = False '画面表示の更新停止

補足日時:2008/06/21 17:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!