• ベストアンサー

ShellExecuteでエクセルファイルが起動しません。

 今、API関数GetOpenFileNameで「ファイルを開く」コモンダイアログを出して、  そこから選んだファイルのフルパスをテキストボックスに入れています。  さらにそのテキストボックスの中に入ったフルパスをAPI関数ShellExecuteで起動  させようとしているのですが、起動してくれません。  ちゃんとフルパスは入っています。  試しに新しいフォームを作ってShellExecute単独で、直接フルパスを  指定してやってみたところ起動できました。  問題は、パスではなく他の引数でしょうか??  ちなみに第1引数   : me.hwnd      第2引数   : "open"      第3引数   : フルパス      第4・5引数 : vbNullString      第6引数   : SW_SHOW と指定しました。  第4と5の引数はvbNullCharや""と指定してみました。  よろしくお願いします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

ShellExecuteの戻り値は?

参考URL:
http://www.vbvbvb.com/jp/gtips/0951/gShellExecuteSwShowNormalOpen.html
hemakozo
質問者

補足

 戻り値は2でした。  参考URLへ行ったんですが、2なので  ERROR_FILE_NOT_FOUNDってことですよね??  ShellExecuteのみではちゃんと起動するんです・・・。    まだ、そのURLのプログラムを動かしていないのでこれから  やってみます。  引き続きおつきあいお願いします。

その他の回答 (3)

noname#4564
noname#4564
回答No.4

[仮説その1] GetOpenFileName の処理で、文字列バッファからNull文字を取り除いていない。(Len関数で文字列長を検証可能) 修正例は、下記。 Dim lngRet As Long lngRet = InStr(ofn.lpstrFile, vbNullChar) Select Case lngRet Case 0 strFullPath = ofn.lpstrFile Case 1 strFullPath = "" Case Is > 1 strFullPath = Left$(ofn.lpstrFile, lngRet - 1) End Select [仮説その2] パスをダブルクォートで括っている。 ファイルのパスを扱うルーチンでは、スペースを含むパス、DOSの8.3形式を超える(いわゆるLongFileName)パスはダブルクォートで括るのが定石ですが、ShellExecute関数は例外で、ダブルクォートなしで動作します。 ※ ダブルクォートがあると、NT4.0環境で動作しません。(Win9x環境および、Win2000以上の環境では問題なし) いまどき、NT4.0でもないので、仮説(1)が有力だと思われます。

hemakozo
質問者

お礼

 詳しいご説明ありがとうございました☆  実は・・・自分で解決いたしました。  報告が遅くなってしまって、お手数をおかけしました。  やっぱり問題になっていたところはパスの指定の仕方でした。  変数の中にフルパスが入ってたんですが、パスの中ではなく、後ろの方に  スペースが入ってたようです。  trimして入れたんですが・・・。  

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.3

いや カレントドライブの変更したら、いけないかなぁー という希望的観測から、ChDriveと言ってみた

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

ChDriveとか?

hemakozo
質問者

補足

 ヘルプでChDriveを調べてみましたが、いまいち私の質問との関連性が  わかりません・・・。  申し訳ありませんが、詳しく説明していただけませんか?  よろしくお願いします。

関連するQ&A

  • ShellExecuteってなんで関数?

    ファイルとかを開く時に使うShellExecuteって何故関数なのですか? Sub test() Dim ファイル名 As String ファイル名 = "C:\Test用テキストファイル.txt" CreateObject("Shell.Application").ShellExecute ファイル名 End Sub このようなコードでファイルを開いていますが、関数って戻り値がある場合に使うのですよね? http://msdn.microsoft.com/ja-jp/library/cc422072.aspx をみたらShellExecuteは関数との事でした。 ずっとメソッドだと思ってました。

  • コモンダイアログの設定

    コモンダイアログを表示させると「読み取り専用ファイルとして開く」というチェックボックスがダイアログの下のほうに出ていますが、このチェックボックスを表示させないようにするにはどうすればいいのでしょうか? コモンダイアログはGetOpenFileName関数で表示させています。 また、APIを利用する上で参考になるサイトをご存知でしたら教えてください。

  • ファイル保存のAPI?

    VBでコモンダイアログで「ファイルを開く」のAPIはわかるのですが、「ファイルを保存」のAPIがわかりません。そのようなAPIがあるのでしょうか?あればAPIの名称を教えてください。 (補足)「ファイルを開く」はGetOpenFileNameですが、これだと「開く」ボタンですが、「保存」ボタンのAPIがあるという事らしいですが、そのAPIを教えて欲しいのです。お願いします。

  • 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窓が閉じないようにするにはどうすればいいのでしょうか?

  • オブジェクト変数の取得

    コモンダイアログを使用して、選択したExcelファイルをAPIの ShellExecute関数で起動を行っているんですが、エクセルファイルを 開いた後に、エクセルのセルのデータを取得したいのです。 オブジェクト変数でエクセルを取得したいのですが、なかなか上手くいきません。 今までは普通に以下のような処理でオブジェクト変数を取得していたのですが set オブジェクト変数 = GetObject("パス") または set オブジェクト変数 = CreateObject("パス") これだど、またエクセルを起動させてしまうので、、 既に起動してしまっているものを取得するのはどうすれば よいのでしょうか? ご教示ねがえませんでしょうか? よろしくお願いいたします。

  • ディレクトリを選択するコモンダイアログボックス

    Windows APIに関する質問です。 GetOpenFileNameを使うとファイルを選択するコモンダイアログボックスが使えますが、ファイルではなくディレクトリ(フォルダー)を選択するコモンダイアログボックというのは存在するのでしょうか?

  • VBからExcelのテキストを指定して開きたい

     VBのアプリケーションから文書名を指定してエクセルを起動したいのですが 出来なくて困っています。ちなみにコードは下記のとおりです。どこに問題があ るのか教えていただけないでしょうか。 Private Sub Command1_Click() Dim lngReturnCode As Long Dim strFileName As String strFileName = "AllTitles.csv"   lngReturnCode = ShellExecute(Me.hwnd, _ "open c:\***\***.xls", _ strFileName, _ vbNullString, _ App.Path, _ SW_SHOWNORMAL) End Sub

  • ファイルの保存ダイアログでデフォルト命名したい

    ファイルの保存ダイアログでデフォルト命名したい Win32API(C言語)編 第55章 ファイルを開く・保存のコモンダイアログ http://www.geocities.jp/ky_webid/win32c/055.html をみてファイルの保存ダイアログを出せるようになりました。 しかし、たまーにフリーソフトなどでもファイルを保存する際に、 デフォルトのファイル名が初期値として指定されているものもあります。 私のソフトでもそのようにしたいのですが、色々な部分に文字列を 入れてみて試してみても、思ったとおりの結果にはなりませんでした。 下記は上記サイトに記載されている ファイルを保存する際のダイアログの出し方から引用したものですが、 これをどのようにしたらダイアログが開いた際にファイル名部分に デフォルト命名された状態で開けるのでしょうか? static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetOpenFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }

  • 「mailto:」の書式

      標記の件で質問です。 「mailto:」で宛先を "Name" <Address> の形式で表示させることは可能でしょうか? mailto:"Name" <Address> の形式でShellExecute関数でメールの起動を試みましたが、 「コマンドラインの引数が正しくありません。使用しているスイッチを確認してください」の エラーとなりました。 問題の箇所のソース(抜粋)は下記の通りです。 'メーラを起動する。 lngRet = ShellExecute(HWnd, _ "open", _ "mailto:" & _ strAddress & _ "?subject=" & strTitle & _ "&cc=" & strCcAddress & _ "&bcc=" & strBccAddress & _ "&body=" & strMailBody, _ vbNullString, _ CurDir$, _ SW_SHOWNORMAL) strAddress のところを、「"Name" <Address>」ではなく、「Address」のみ指定した場合は 正常に動作します。 アドレスの書式で名前を指定する正しい書き方をご存知の方、コメントを頂けると助かります。 (クライアントはOffice 2000アプリケーションで、OSはWindows 2000 SP2です)  

    • ベストアンサー
    • HTML
  • ファイルオープンの際のウィンドウハンドルの取得方法

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 ShellExecute関数でファイルをオープンさせた際に、 開かれたファイルウィンドウのHWNDまたはCWndを 取得したいのですが、実現方法が分かりません。 ・やりたい事  複数ファイルをオープンさせて、各ファイルが閉じられた時に、  ファイル毎に任意の処理を行いたい。 マルチスレッドにて、CreateProcess→ファイルオープンを行い、 WaitForSingleObjectで、ファイルが閉じられるまで待機し、 コントロールが戻ってきたら、任意処理をするようにしていたのですが、 PowerPointファイルは複数ファイルを立ち上げても、 1プロセスにしかならないため、実装の変更を余儀なくされました。 CWnd->m_hWndで、各ファイルの区別が付けられるのではないかと 考え、現在、テスト用処理を組んでいるところです。 ファイルが閉じられたかどうかは、APIフックを用い、 DestroyWindowが呼ばれた際のHWNDを、自作プログラム側に送り、 ShellExecute時に取得しておいたHWND(またはCWnd)であれば、 任意処理へ移行。といった流れを考えています。 ShellExecute時に立ち上がったファイルのハンドルの 取得方法、または、全く別に、上記の目的を満たす 処理方法がありましたら、アドバイスお願いします。