色々と過去ログやら見ているのですが方法が分からず書き込みしました。
現在、ローカルでHTMLファイルを作成しています。(画像を表示させてます)
そのHTMLファイルをボタンをクリックすることで立ち上げたいのですが
Shellではファイルが見つかりませんとエラーが返ってきてしまいます。
どなたか方法を教えていただけると助かります。
宜しくお願い致します。
WindowsXP SP1,VB.Net,Windows.Formsです。
VB6の関連付けられたアプリでオープンする方法の
サンプルモジュールですがこれでは駄目ですか?
Option Explicit
'= 関連付けられている実行可能ファイルによりファイルを
'= オープンまたは印刷する拡張関数の宣言
Declare Function ShellExecuteEx Lib "shell32.dll" _
Alias "ShellExecuteExA" _
(lpExecInfo As SHELLEXECUTEINFO) As Long
'= 指定されたプロセスの終了状態を取得する関数の宣言
Declare Function GetExitCodeProcess Lib "kernel32.dll" _
(ByVal hProcess As Long, _
lpExitCode As Long) As Long
'= オブジェクトの状態がシグナル状態あるいは
'= タイムアウト時間が経過するまで待機する関数の宣言
Declare Function WaitForInputIdle Lib "user32.dll" _
(ByVal hProcess As Long, _
ByVal dwMilliseconds As Long) As Long
'= 待機
Public Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
'= オブジェクトハンドルをクローズする関数の宣言
Declare Function CloseHandle Lib "kernel32.dll" _
(ByVal hObject As Long) As Long
'= 実行するアプリケーションの情報を定義する構造体の宣言
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hWnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
'= プロセスハンドルの取得を示すマスク定数
Public Const SEE_MASK_NOCLOSEPROCESS = &H40
'= ウィンドウの表示状態を示す定数の宣言
Public Const SW_SHOWNORMAL = 1
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMAXIMIZED = 3
'= プロセスの終了状態を示す定数
Public Const STATUS_PENDING = &H103&
Public Const STILL_ACTIVE = STATUS_PENDING
Public Function OpenFile(strFileName As String) As Boolean
Dim udtShellExecuteInfo As SHELLEXECUTEINFO
Dim lngProcessExitCode As Long
Dim lngResult As Long
Dim lngInstr As Long
Dim lngFor As Long
OpenFile = False
' 実行するファイルの情報を指定
With udtShellExecuteInfo
.cbSize = Len(udtShellExecuteInfo)
.fMask = SEE_MASK_NOCLOSEPROCESS
.hWnd = App.ThreadID
.lpVerb = "open"
.lpFile = strFileName
.lpParameters = vbNullChar
.lpDirectory = vbNullChar
.nShow = SW_SHOWNORMAL
End With
'= 関連付けられている実行可能ファイルにより印刷
If ShellExecuteEx(udtShellExecuteInfo) <> 1 Then
Exit Function
End If
'= 新しいプロセスを作成できたときは
If udtShellExecuteInfo.hProcess = 0 Then
'= エラーはシステム上で出力
Exit Function
End If
'= 初期化待機
If WaitForInputIdle(udtShellExecuteInfo.hProcess, 600000) <> 0 Then
Call CloseHandle(udtShellExecuteInfo.hProcess)
Exit Function
End If
Call CloseHandle(udtShellExecuteInfo.hProcess)
OpenFile = True
End Function
あっ…元々印刷処理用の関数だったので…
一部コメントがおかしいところがありますが気にしないで下さい…
36NETさん。
さっそくのレス。ありがとうございます。
ちょっとまだ分からないところがあるので調べてみますが、
これではダメなような・・・できてももっと簡単な方法があるのでは?
なんて思ってます。
ちなみに今は一時的な逃げの手段としてbatchファイルを作成して、
それをキックして逃げてます。
ただ出来るだけBatchファイルとか使いたくないのでVB内で
解決できればと思っています。
Internet Explorerを起動して、そのHTMLファイルを引数で渡せたりとか。。。
なんか上手いやり方ないですかね?
つまりこんな感じでしょうか?
Shell "C:\省略\IEXPLORE.EXE C:\tmp\test.html"
36NETさん。お返事遅くなりました。
無事に解決できました。
IEXPLORE.EXEとHTMLファイルのパスの間に
カンマで区切りを入れていたためにエラーになっていたみたいです。
有難う御座いました。