• ベストアンサー

ShellExecuteの使い方について

 既存のプログラム(他の人が作成したもの)を参考にプログラムを作成しましたが、どうしても、希望通りの挙動となりません。ShellExecuteの部分が要点と思いますので、その点について教えてください。言語は JavaScript です。  以下のような記述がありました。 ---- var launcher = new ActiveXObject("Shell.Application"); launcher.ShellExecute(cmd, param, "", "open", "1"); ----  ShellExecute の引き数の cmd は、実行ファイル名(ファイルパス付)、param は実行ファイルの引き数です。これはこれで動いています。  さて、これを参考に、cmd の部分にDOSコマンドを与えました。すると、DOSコマンドは実行されたものの、実行の瞬間に黒いウィンドウ(おそらく、コマンドプロンプトと思われます)が一瞬表示されました。この黒いウィンドウを表示させずにDOSコマンドを実行させたいのですが、引き数を調整することでそのようなことは可能でしょうか。  Webで調べたところ、ShellExecute の引き数として SW_SHOWNORMAL や SW_MAXIMIZE などを与える方法もあるようですが、SW_*** を紹介しているWebページでは、そもそも引き数の個数が上記と異なっていたりします。  ご助言をお願い致します。

  • condo
  • お礼率85% (86/101)

質問者が選んだベストアンサー

  • ベストアンサー
  • struct
  • ベストアンサー率72% (32/44)
回答No.1

最後の引数を0にしたらどうですか。 launcher.ShellExecute(cmd, param, "", "open", 0); ShellExecuteという名前はWin32APIから来ています。 他の言語であっても同名で似たような動作をする関数が大概存在しますが、 当然、名前を一緒にしただけなので引数などのインターフェースが違ってきます。 そういうわけで検索するときは「Shell.Application」を付けて検索するなどした方がいいかもしれません。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/reference/objects/ishelldispatch2/shellexecute.asp

condo
質問者

お礼

 情報をご提供くださり、ありがとうございます。  最後の引数を 1 → 0 に変更して試行したのですが、それでも黒い画面が一瞬表示されてしまいました。他の方からの情報も加味すると、これについてはどうしようもないものと考えました。今回実行しようとしているDOSコマンドに相当する関数を探す、などの方向転換をするつもりです。  ご教示いただいたURLですが、いくら探しても見つからなかった ShellExecute のインタフェース(引数)が分かり、大変参考になります。  どうもありがとうございました。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★『ShellExecute』関数では無理です。 ・引数に『SW_SHOWNORMAL』や『SW_MAXIMIZE』を与えてもそれは『コマンド・プロンプト』の  ウインドウを制御するものではありません。実行させる DOS コマンドなどへの指示です。  つまり、メモ帳などを起動させようとして『SW_MAXIMIZE』を指定するとメモ帳のウインドウが  最大化されて表示されます。また、『SW_HIDE』を指定してもメモ帳などのウインドウが非表示  になるだけです。 ・あと Web で調べて ShellExecute の引数の数が違うのは、Web での情報が Windows の API 関数  の引数を説明しているページがほとんどで、Java Script はその API 関数も利用できるように  機能を取り込んでいるだけです。このため、引数の順番も何か違っていますね。注意が必要! ・『Java Script』はあまり詳しくありませんが、API関数ならば『CreateProcess』関数などの  プロセスを起動させる方法で『コマンド・プロンプト』を非表示で実行できたと思います。  『Java Script』にも似たような関数があればそれを検索などして探して下さい。 ・以上。『ShellExecute』関数では無理という事だけアドバイスします。 ・おわり。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpshell/html/_win32_shellexecute.asp
condo
質問者

お礼

 情報をご提供くださり、ありがとうございます。  使用している関数 ShellExecute は、「SW_MAXIMIZE」を引数として受け付けるものとは異なるという事が分かり、これについて無駄に調査時間を消費しなくて済ませることができました。  どうもありがとうございました。

関連するQ&A

  • ShellExecuteのコマンドについて

    すみません、どなたか教えてください。 下記のコマンドですが、 ShellExecute(null,"open","cmd.exe","実行したいもの",NULL,SW_HIDE); "実行したいもの" の書き方なんですが、 "/c c:\\work\\test.bat" のように書くと、cmd.exeにtest.batを実行させることができたんですが、 実行したいtest.batが指定できず、変数でセットする場合の書き方が分かりません。 ShellExecute(null,"open","cmd.exe","/c c:\\work\\test.bat",NULL,SW_HIDE); ↓ ShellExecute(null,"open","cmd.exe","/c c:\\work\\ "" & 変数 & "",NULL,SW_HIDE); こんな感じだと思うのですが、変数をダブルクォーテーションで囲むときに、ダブルクォーテーションをいくつ重ねるのかが分かりません。ググっているのですが、どこを調べていいのか分からず、はまっています。どなかたアドバイスお願いします。C++です。

  • ShellExecuteでDOSコマンド実行したら...

    VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを 実行したいのですが、うまくいきません。 1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW); ...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、 なにも実行されません。 2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW); ...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。 3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW); ...としてもファイルが作られず、2.と全く同じ結果になってしまいます。 これはどうしてこのような現象が起きるのでしょうか? DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。 あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?

  • ShellExecuteで外部アプリを起動したい

    こんにちは。 ShellExecuteを使って外部アプリを起動するために、 ShellExecute(NULL,NULL,"Program Files/XWaveClient/XWavePDA.exe",NULL,NULL,SW_SHOWNORMAL); というコードをかいているのですが、この行で  error C2065: 'ShellExecute' : undeclared identifier というコンパイルエラーがでてしまい、困っています。 ShellExecuteを使うためにはなにかヘッダファイルを includeしなくてはならないのでしょうか? 環境は、eVC++4.0です。 よろしくお願い致します。

  • ShellExecuteのことで。

    はじめまして。 最近c言語のプログラミングを始めて、 cでフォルダを開くプログラムをテストしていましたら、 あるフォルダだけ、エラーが発生して、開けません。 フォルダのほうも色々見たのですが、 どうしてもわからないのでどなたか教えてください。 普通に開けたときは33だったのですが 開けなかったフォルダでの戻り値は42でした。 #include<stdio.h> #include<windows.h> int main(void){ HINSTANCE a; a=ShellExecute(NULL,"open","test",NULL,"D:\\",SW_SHOWNORMAL); printf("return = %d",a); return 0; }

  • Delphiの型変換について教えてください

    DelphiからRubyプログラムを起動するには ShellExecuteを使えばいけそうなことがわかったのですが、コンパイルでエラーが出ます。 ShellExecute(Handle,'open'、'xxx.rb',OpenDialog1.FileName,syori,SW_SHOWNORMAL)としたのですが TFileNameとPAnsiCharには互換性がありませんとエラーが出ます。 どんな関数を使って変換すればいいのでしょうか?

  • windowsプログラム WinMainの引数nCmdShowのデフォルトの値は?

    C++でwindowsプログラムを作成する場合について質問です。 WinMainの引数nCmdShowのデフォルトの値はSW_SHOWNORMALでしょうか。 また、コマンドラインからアプリケーションを起動する場合、どうやってnCmdShowの値を渡せばよいのでしょうか。

  • VC++ で.bat起動

    また、こちらを使わせていただきます。 VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。 .bat fileは次のとおりです。 cd\Program Files\Wireshark> tshark -i.2 greater 170 -a duration:2 -w.... tshark -v-r e:\Test\test5.pcap.... VC++は次のとおり void CStartupapplicationView::OnBnClickedButtontest() { //cmdは、ShellExecuteでも、CreateProcessでも開けられますが、 //bat fileの起動がうまくいきません。 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL); ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW); //.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。 if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK); //別の方法 STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory(&sinfo,sizeof(STARTUPINFO)); ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION)); sinfo.cb=sizeof (STARTUPINFO); sinfo.dwFlags=STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_SHOWNORMAL; if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "), // test2.batは、Document and settings/----------- //Startup applicationの下にはいっていますが、起動しません。 NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)); {//起動失敗 } //

  • ShellExecuteでURLのアドレス表示が変

    どなたか教えて下さい。 開発環境は vb6 windowsXP sp2 です。 例えば ShellExecute(0, "open", App.Path & "http://hoge.htm", 0, 0, SW_SHOW) でIEを開いています。 開発環境では、うまくIEが開くのですが、 サーバーで実行すると、アドレスが 『http://hoge.htm%20"http://hoge.htm"』となってしまい画面がエラーとなってしまいます。 原因はサーバーなのでしょうか。 プログラムなのでしょうか。 サーバーはwindows2003サーバーです。

  • ShellExecuteExでスペースを含む引数を渡すには?

    すみません。 ShellExecuteEx関数を使用して、コマンドラインで実行していた実行ファイルを起動させたいのですが、実行ファイルに渡す引数にスペースが含まれると、ペースの前までか渡せないのですが、スペースを含む引数を渡す方法を御存知ないでしょうか? (詳細) コマンドライン(cmd.exe)では”○○○.exe 引数1 引数2 引数3(リターン)”で実行しているのですが、ShellExecuteEx("○○○.exe", "引数1 引数2 引数3”, NULL, ・・・・, SW_SHOW); のような形で作成して実行すると、引数1までで○○○.exeが実行されてしまい、スペースを挟んだ引数2以降が渡せていません。 スペースを挟んだ引数を渡す方法を御存知ないでしょうか? すみません。

  • 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

専門家に質問してみよう