飛ぶ理由がわかりません

このQ&Aのポイント
  • VC2010で書かれたコードについて、アプリが飛んでしまう現象が起きています。
  • 同じことをしているはずなのに、1の方法ではアプリが飛び、2の方法では正常に動作します。
  • 原因がわからず、環境の問題なのかもしれません。
回答を見る
  • ベストアンサー

飛ぶ理由がわかりません

VC2010 で以下のコードを書きました 同じことやってると思うのですが1ではアプリが飛んで2では正常に動きます この原因がわからないのですがなzでしょうか(ひょっとして環境的なもの?) 1. CreateProcess(NULL,TEXT("C:\\Windows\\Notepad"), NULL, NULL,FALSE,0, NULL, NULL, &si, &pi) ; 2. LPTSTR szCmdline = _tcsdup(TEXT("C:\\Windows\\Notepad")); CreateProcess(NULL,szCmdline , NULL, NULL,FALSE,0, NULL, NULL, &si, &pi) ;

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

  • ベストアンサー
  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.2

パスの文字列に格納領域が1は静的領域ですが、2は動的領域ですね。 CreateProcessの仕様を見ると、第2パラメータの型はLPTSTRとなっています。これは動的領域ってことですよね。静的領域が要求されている場合だとLPCTSTRになるはずですよね。 ただ、この違いで動作が変わるって例をあまり知らないです。第2パラメータの領域が関数内で一時的に書換えられたりするんでしょうかね。

koi1234
質問者

お礼

なるほど  正直な処 これまで動的・静的にそこまで気を使っていませんでした >この違いで動作が変わるって例をあまり知らないです ですよね 固定で書いてある例が動いたりしているので????状態だったのですが これからもっとパラメータに注意したいと思います UNICOD指定した時はより注意しないと危ないな   と実感しました (ほとんどマルチバイトで書いていた)

その他の回答 (1)

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

そのように書かなければならないと覚えてください。 LPTSTR の第2引数はTEXT("C:\\Windows\\Notepad")ではなくて、 LPTSTRで定義されたszCmdlineであると。

koi1234
質問者

お礼

回答ありがとうございます そのように書かなければならない  とのことですが ネット上のサンプル検索では実際に1のパターンで記載しているものもあり 手元で同じコードを実行したところ動いています http://www.kumei.ne.jp/c_lang/intro2/no_113.htm 違いとすればコンソールアプリ(マルチバイト)か Win32アプリ(Unicode)の違いくらいです もしマルチバイト/Unicodeで動きが違うのであればそういうものだ ではなくてバグの一種ではないかと思うのですがどうなのでしょうか?

関連するQ&A

  • C&C++から*.exeを呼ぶ方法の種類について

    C&C++から*.exeを呼ぶ方法として 私は今まで 1)CreateProcessを用いる方法 具体例は以下 ret = CreateProcess(NULL, "\"c:\\WINDOWS\\system32\\notepad.exe\" \"c:\\test.txt\"", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); でよんでいたのですが他に 方法はありますか??? あればできれば具体的に例でいいので簡単な ソースコード(API)をおしえてくださいm(___)m よろしくおねがいします。

  • CreateProcess関数について

    ■CreateProcess関数で実行フアイル(.exe)を呼ぶプログラムを作成しています。 ■CreateProcess関数はプロセスを作成すると直に呼出側に戻って来るが、起動したプログラムの実行結果ではない。 ■その様な事を踏まえてプログラム下記にコーテイングしました(概要) ■「呼び出し側」も「呼び出される」もCD-ROM内に有ります。 ■問題はCreateProcess関数で呼んでから、実際に画像が表示されるまでに、時間が掛かる事です。、 ■「質 問」「やりたい事」 CreateProcess関数で呼んでから、実行画面が表示される時間の間に 「その旨のなんだかのメッセージを表示したい」 例えば、Webでのダウンロードやインストールの時の様な... この様な事を、実現するのはどの様にしますか、宜しくお願いします。 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(CreateProcess(NULL,(LPTSTR)cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){ CloseHandle(pi.hThread); //CD-ROMから直ぐ表示出来ない場合に備えて //この間で表示に時間を要している事をメッセージ出来ないか? ShowWindow(hWnd,SW_MINIMIZE);//タスクトレイに入れる。 WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); ShowWindow(hWnd,SW_RESTORE););//タスクトレイから出す。 }

  • VC++6.0からIEの起動ができない

    つぎのようなCodeを書きましたが、コメント行のようなnotepad.exeを指定すると起動できるのですがブラウザIE(iexplore.exe)を指定すると起動しません。  省略 STARTUPINFO si; PROCESS_INFORMATION pi; char buf[256]; LPTSTR lpCommandLine; strcpy(lpCommandLine,"iexplore.exe d:\\data\\update.html");  //strcpy(lpCommandLine,"notepad.exe d:\\data\\update.html");  //  strcpy(buf,lpCommandLine); ZeroMemory( &si, sizeof( STARTUPINFO )); si.cb = sizeof( STARTUPINFO ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; BOOL t=CreateProcess( NULL, lpCommandLine, // コマンドライン文字列 NULL,NULL,FALSE, 0, NULL, NULL, &si, &pi)) // //起動したプロセスの終了を待たない場合 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); :  省略 なを、「スタート」メニューの「ファイル名を指定して実行」に「iexplore.exe d:\data\update.html」を指定すれば起動します。 以上です。よろしくお願いします。

  • CreateProcessでの環境変数の設定の仕方

    PATHを設定してCommand.comを実行したいのですが、 CreateProcessでの環境変数の設定の仕方がわかりません char* env = "PATH=c:\\data"; CreateProcess(NULL,"command.com /k path ", NULL, NULL, FALSE, 0, env, NULL, &si, &pi); このようにしてみたところDos窓が起動しますが、 表示されるPATHはデフォルトのままです。 環境は VC++6.0 MFC です。 どうか宜しくお願いします。

  • 親プロセスの切り離し?

    USBメモリ内で動作するプログラムから、パソコンにインストールされているプログラムを起動後、USBメモリ内にあるプログラムは自動的に終了するようにしています。 この状態で、"ハードウェアの安全な切り外し"で、USBメモリを停止できるようにしたいのですが、何かいい方法はないでしょうか? 試しにメモ帳を利用する、次のコンソールプログラムを作って、USBメモリ内で起動したところ、やはりUSBメモリを停止することができませんでした。 -- #include <windows.h> int main(int argc, char* argv[]) { BOOL bRes; STARTUPINFO si={0}; PROCESS_INFORMATION pi={0}; si.cb = sizeof(STARTUPINFO); if(CreateProcess(NULL, "C:\\Windows\\notepad.exe C:\\a.txt", NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); bRes=TRUE; } return 0; } -- ※C:\\a.txtは適当なテキストファイルを作成して置いてます。 普段、秀丸エディタを使っているので、試しに "C:\\Windows\\notepad.exe C:\\a.txt" を "C:\\Program Files\\Hidemaru\\Hidemaru.exe C:\\a.txt" に変更した試したところ、USBメモリを停止することができました。 秀丸エディタだとUSBメモリを停止することができるので、起動される側のプログラムで何かすれば停止できるようになるとは思いますが、何をすればいいのかさっぱりわからず困っています。

  • CreateProcessでのウィンドウサイズの指定方法

    CreateProcessでプログラムを実行するようなプログラムを作成した際に表示されるウィンドウサイズを最大化したり最小化したりするのではなく、ある大きさにしたいのですが、うまくいかないのでご存知の方教えてください。 BOOL testProgram; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si,0,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWDEFAULT; si.dwXSize = 500;  si.dwYSize = 400; // 例えばこんな風にサイズを指定したいのです testProgram = CreateProcess( NULL, "**.exe", // ここには具体的なものが入ります。 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if(testProgram!=TRUE)return FALSE; WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); このようなプログラムを書いてみたのですがうまくいきません。(プログラムは抜粋です) 何かいい方法ご存知の方教えていただけないでしょうか? よろしくお願いします。

  • CreateProcessでの実行ファイルの操作について

    VC++ 6.0 Win98 カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。 CreateProcessでは、相対パスや絶対パスは使えないのでしょうか? ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。 あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・) STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESTDHANDLES; si.hStdOutput=hFile; si.hStdError=hFile; char szCommand[]= "C:\\\"My Documents\"\\nannka\\VC++\\Ten3\\eee"; PROCESS_INFORMATION pi; CreateProcess( NULL, szCommand,//コマンド //NULL, NULL,NULL, TRUE, 0, NULL,NULL, &si,&pi ); よろしくお願いします。

  • アプリケーション起動について

    ひろと申します。 クライアントからサーバの共有フォルダにある、他のアプリケーションを オプション付きで起動させるプログラムをVC++で作成したのですが、 クライアントがNTだとうまくいきません。 たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで 起動すると、クライアントがwin98の場合はアプリケーションが 表示されるのですが、NTから起動させようとすると、 アプリケーションは表示されません。 また、オプションを外すとアプリケーションは NTでも表示されます。 APIは、WinExec,ShellExecuteEx,CreateProcessで試したのですが 同じ結果でした。 CreateProcess は以下のように設定してます。 ------------------------------------------------------------------ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; CreateProcess(NULL, "serverpath\\app.exe /i", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); プロセスの起動は成功していうようです。 クライアントがNTの場合、他に必要な設定があるのでしょうか? よろしくお願いします。

  • CreateProcessの制御について

    今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、 呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ) なにか原因があるのでしょうか。また、対処方があれば教えてください。 【前提】 ・本体exeにウィンドウは必要なし ・バッチの場合はcmd.exeは非表示 【環境】 ・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6 ・実行はXP SP2 とWin2000 双方で同様の結果 【ソース】 #include<windows.h> int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , PSTR lpCmdLine ,int nCmdShow ) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS, NULL,NULL,&si,&pi); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); return 0; }

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

専門家に質問してみよう