- ベストアンサー
VBでShell○なのにShellExecute×
http://support.microsoft.com/kb/170918/ja 等を参考に、コンソールアプリからHTMLファイルを呼び出すだけのEXEをVB(Visual Basic 2008 Express Edition)で作ったところ、 Shell関数ではHTMLがIEで起動されるのに対し、ShellExecute関数ではダメでした。 HTMLへのファイルパスが正しいことはMsgBoxで確認しました。 また、ほぼ同じソースをbasにしてExcelから起動すると、ShellExecuteでも起動しました。 以下がソース(抜粋)になりますが、原因が分かる方がおられましたら、ヒントだけでも、ご教示いただけると幸いです。 よろしくお願いいたします。 - - - - - - - - - - - - - - - - - - - - - - Option Explicit On Module Module1 Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long 'エラーコード宣言略 Function StartDoc(ByVal DocName As String) As Long Dim Scr_hDC As Long Scr_hDC = GetDesktopWindow() 'こちらだと成功 StartDoc = Shell("explorer.exe" & " " & DocName, vbNormalFocus) StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _ "", "C:\", SW_SHOWNORMAL) End Function Sub Main() Dim r As Long, msg As String r = StartDoc(CurDir() & "\target.html") 'エラーハンドリング省略 End Sub End Module
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Declare宣言の WinAPIで使っている Long型引数が問題なのです VB6のころは 32bit長の整数はLong型でしたが VB.NET系は Integerが32bit長の整数になります これの違いで スタックに積んだデータがShellExecuteへうまく渡らないため実行されないのだろうと思います
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1416)
VB6以前とVB.NET以降は全く別言語と思うべきです。
お礼
VBAやVBScriptは多少業務で触ったことがあるのですが、VBは初心者&初日なもので、ExpressEditionはVB6なのかなと思っておりました。 初歩的な質問に対してのコメント、ありがとうございました。
お礼
ご指摘を参考に、以下の修正を行なったところ、期待通り実行されました。ありがとうございました。 <変更前> Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long <変更後> Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Integer, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Integer) As Integer