VB6からMAKECAB.EXEを呼び出してキャビネットファイルを作成するには?


Yuki  2006-10-30 03:40:37  No: 97066

試行錯誤したのですが上手くいかないので質問させて下さい。

使用言語はVB6です。
VisualStudioのディストリビューションウィザードでセットアップファイルを作成すると\Supportってフォルダが作成されますよね。
そのフォルダ内に作られる(実行プログラム名).batをプログラムから起動して、(実行プログラム名).cabを作成したいのですが、どうにも上手くいきません。
現在のファイル構成は以下の通りです。

・実行プログラム.exe
・DATA.MDB
・<Work>フォルダ
    ・MAKECAB.EXE
    ・<Support>フォルダ
        ・(実行プログラム名).bat
        ・AdmissionManagementSys.DDF

プログラムの呼び出し部は以下のように書いています。

Shell "command.com /c " & App.Path & "Work\Support\(実行プログラム名).bat", 6

バッチファイルの中身は以下の通りです。

"..\MAKECAB.EXE" /f "AdmissionManagementSys.DDF"

バッチファイルを直接叩いた場合は正しく動作するのですが、プログラムから呼び出した場合は上手く動きません。パス指定の部分がまずいのだと思いますが、プログラムがインストールされるフォルダがあらかじめ分からないので、バッチファイルに絶対パスを書き込むわけにもいきません。何か良い方法はありませんでしょうか?
よろしくお願いします。


通ってみた  2006-10-30 08:44:07  No: 97067

>Shell "command.com /c " & App.Path & "Work\Support\(実行プログラム名).bat", 6

Shell "command.com /c " & App.Path & "\Work\Support\(実行プログラム名).bat", 6

だと動くってオチではないですよね
やりたいことの内容はともかく、この手のミスはよくありますから・・・よく確認してみてください


もげ  2006-10-30 18:20:14  No: 97068

やりたいことは、
http://support.microsoft.com/default.aspx?scid=kb;ja;176810
のような感じですかね。
BATファイルではなく、
>"..\MAKECAB.EXE" /f "プロジェクト名.DDF"
のほうをMAKECAB.EXEのフルパス指定で実行してもいいのでは?

'以下は、
'DOSプロンプト(コマンドプロンプト)の呼び出し方に関する
'一般的な問題のような気がします。

OSは何でしょう?
Win9x系限定でないのであれば、
command.comではなくてcmd.exeを使用するほうが適切であるケースもあります。
両者の違いを吸収するには、
Environ$("ComSpec")を使ってみてもいいかもしれません。

>Shell "command.com /c " & App.Path & "Work\Support\(実行プログラム名).bat", 6 

このように直接実行すると、
試行結果を確認できずに錯誤を繰りかえす要因になるので、
実行文字列を一旦文字列変数に格納してデバッグ表示させる
等するといいでしょう。

あとは、
Program Files とか、Documents and Settings
のように空白を含むパスを渡す場合はダブルコーテーションで囲う必要がある
場合がありますので注意が必要です。

パスの結合時の文字列端の「\」のミスをなくすには、
FileSystemObjectオブジェクトのBuildPathメソッドなんかを使ってみるといいですね。

Dim fso As Object
Dim strComLine As String
Dim strPathExec As String
Set fso = CreateObject("Scripting.FileSystemObject")
strPathExec = fso.BuildPath(App.Path, "Work\Support\(実行プログラム名).bat")
strComLine = Environ$("ComSpec") & " /c " & """" & strPathExec & """"
Debug.Print strComLine
'もしくは MsgBox strComLine
Shell strComLine, vbMinimizedNoFocus
Set fso = Nothing


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加