• 締切済み

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; }

noname#41708
noname#41708

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> あるフォルダの中に > test.exe(問題のプログラム)と test(フォルダ) > と同じフォルダにこの2つをいれているのですが、もしかしてこれが原因になるってことはありますか? ShellExecuteではフォルダ(ディレクトリ)も実行ファイルも拡張子抜きで指定できるので調べてみました。 同じディレクトリ下に test というディレクトリと test.exe が存在しているときに a=ShellExecute(NULL,"open","test",NULL,"D:\\",SW_SHOWNORMAL); を実行すると、test.exe が優先されるようです。 MSDNを検索してみたのですが、この辺の優先順位に関する記述はありませんでした。 問題の場所にある test.exe がどういう挙動をするものかわかりませんが、 何か痕跡を残すようなものならそれを調べてみれば起動されていることがわかると思います。

noname#41708
質問者

補足

名前を変えずにほど試したら、Dosプログラムが無限ループされているように起動され続けました。 その後に、プログラムの名前を[ )test.exe ]に変えて試したところ動きました。 やはり、名前が同じなのが原因っぽそうです。 お手数かけてすみませんでした。 すごく助かりました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> 普通に開けたときは33だったのですが > 開けなかったフォルダでの戻り値は42でした。 ShellExecuteが失敗したときの戻り値は32以下ということになっているので 42を返しておいて開けない(失敗している)というのはちょっとわかりませんね。 GetLastError で何か情報が得られませんか?

noname#41708
質問者

補足

GetLastErrorはそのままついか大丈夫なんでしょうか? もしかしたら、プログラムをおいてある場所が悪いんでしょうか? あるフォルダの中に test.exe(問題のプログラム)と test(フォルダ) と同じフォルダにこの2つをいれているのですが、もしかしてこれが原因になるってことはありますか?

関連するQ&A

  • ShellExecuteをつかって・・・

    もしかしたら非常に簡単な問題かもしれないんですけど、 SDIベースでShellExecuteをつかって以下のような関数を作ってコンパイルすると、 ”error C2065: 'm_hWnd' : 定義されていない識別子です。” がでます。 前に別プロジェクトでやったときは特に定義せず使えたような気がするのですが、 何か使い方が間違っているのでしょうか? #include "stdafx.h" #include "FCwin.h" #include "MainFrm.h" #include "FCwinDoc.h" #include "FCwinView.h" ・・・中略・・・ int CFCwinApp::DosFcExe() { HINSTANCE ret = ShellExecute(m_hWnd,"open","command.com",NULL,"c:\\",SW_SHOW); if((int)ret <= 32 ){AfxMessageBox("DOS窓開けません",MB_OK);return 1;} return 0; }

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

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

  • 一定時間ごとにプログラムを起動させるプログラムを作りたい

    「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #include <windows.h> #include <stdio.h> void CALLBACK kidou() { char pass[255]; sprintf(pass,"./test1.exe"); ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL); } void main() { SetTimer(NULL,1,1000,kidou); } この様な感じで作成しましたが、「test.exe」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?

  • 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++です。

  • 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)); {//起動失敗 } //

  • http://www.***.com/goo.htm(仮)

    のページを見るために #include <string> #include <fstream> using namespace std; WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { ofstream ofs; string html,file; file="c:\\gomi.url"; ofs.open(file.c_str()); if(ofs.is_open()) { html="[InternetShortcut]\n; html+="URL=http://www.***.com/goo.htm\n"; ofs<<html; ofs.close(); ShellExecute(NULL,"open",file.c_str(),NULL,NULL,SW_SHOWMAXIMIZED); } return 0; } としてgomi.urlにurlフォーマットのアドレスを書き込んでそれを開くことによってできますがもっと直接的にアプリで http://www.***.com/goo.htm を見る方法を教えてください

  • 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は関数との事でした。 ずっとメソッドだと思ってました。

  • ShellExecute、エクスプローラで選択状態

    お世話になってます。 VC++2010、MFCでファイルリストを生成するプログラムを作っています。 (今回質問した部分以外は正常に動作しています) ファイル生成後、エクスプローラで、生成したリスト(○○.html)を選択状態にしたいです。 しかし、デスクトップ直下に同名のファイル( 例: AlbumList.html )が既にある場合、うまく行きません。 【不具合1】ファイルの生成は意図したディレクトリにされているのに、エクスプローラに「/select」をつけて、開くと、デスクトップ直下の同名のファイル( 例: AlbumList.html )が開かれて(選択されて)しまう   TRACE(_T("◆FileName→%s \r\n" ),FileName);   TRACE(_T("◆savePath→%s \r\n" ),savePath);   //★エクスプローラで開く   ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), _T("/select,") + FileName , savePath, SW_SHOWNORMAL ); トレース結果:  ◆FileName→AlbumList.html  ◆savePath→D:\\Visual Studio 2010 - Data\\Projects\\FileListCreator_Shift-JIS(75)\\Debug\\FileListCreator(LIST)\\ エクスプローラに開かれて、選択状態になったファイル  C:\ユーザ\[ユーザ名]\デスクトップ\AlbumList.html 更新されたファイル  D:\Visual Studio 2010 - Data\Projects\FileListCreator_Shift-JIS(75)\Debug\FileListCreator(LIST)\AlbumList.html 【不具合2】デスクトップに ・ FileListCreator.lnk (リンク)(H:\FileListCreator へのリンク) ・ FileListCreator (フォルダ)(デスクトップにおいた FileListCreator.exe が入っているフォルダ)  (C:\Users\[ユーザ名]\Desktop\FileListCreator) があり、FileListCreator.exe から 以下のコードを実行するボタンを押すと、リンクの方が開かれてしまう。 ※リンクフォルダ名、exe名ともに、「FileListCreator」でかつ両方がデスクトップにおかれている場合に問題が起こる。   //http://rararahp.cool.ne.jp/vc/vctips/api.htm   // 実行ファイルのフルパス取得   TCHAR szPath[_MAX_PATH];   GetModuleFileName( NULL, szPath, MAX_PATH);   CString CurDir;   CurDir = CurrentDirFunc(szPath); //szPathからファイル名を取り除くユーザー関数   if (CurDir !=_T("")){     CurDir.Replace(_T("\\"),_T("\\\\"));   }   //★エクスプローラで開く   ShellExecute(NULL, _T("open"), CurDir, NULL, NULL, SW_SHOWNORMAL); リンクファイル名を 「FileListCreator2.lnk」などと違う名前にすると、実行ファイルのディレクトりが正しく開かれる。  →【不具合2】の方は、うまく説明できないので、(1)だけでもお教え下さると嬉しいです。 宜しくお願いします。

  • cではよくてc++ではダメな理由

    #include <stdio.h> #include <stdlib.h> int main(void) { int *x; x = calloc(1, sizeof(int)); if (x == NULL) puts("記憶域の確保に失敗しました。"); else{ *x = 57; printf("*x = %d\n", *x); free(x); } return 0; } 上のソースなのですがcallocの戻り値がvoidなのでintにはキャストしてくれみたいなことを コンパイラに言われます。 cではコンパイルできてc++ではコンパイルできないのはなぜでしょう。

  • ファイルから文字列を読み出して16進数に変換

    test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26

専門家に質問してみよう