none
C言語のCreateProcess関数に関する質問 RRS feed

  • 質問

  •  CreateProcess(strExePath, NULL, NULL, NULL, FALSE, 0, NULL, strCd, &si, &pi);

    実行するプログラムstrExeのカレントフォルダをstrCdにしようとしてるんですけど、

    上のようにすると親プロセスと同じフォルダになってしまいます。

    どうすれば解決できるでしょう?

    作業環境はWindowsVistaHomeBasic + VisualC++2005ExpressEditionで、開発言語はCです。

    返答待ってます。

    2007年11月11日 13:56

すべての返信

  • > VisualC++2005ExpressEdition

    なら

    http://forums.microsoft.com/MSDN-JA/ShowForum.aspx?ForumID=188&SiteID=7

    のほうが適切かも。

     

    >親プロセスと同じフォルダになってしまいます。

    はどのようにして確認していますか?

    また、カレントフォルダはどこになりますか?

     

    >WindowsVista

    の場合、今までのOSのように、プログラムのあるフォルダに容易にファイルを作れるようなつくりになっていないところがあります。

    (たとえば、C:\Program File配下のフォルダとか)

    2007年11月11日 14:59
  • > http://forums.microsoft.com/MSDN-JA/ShowForum.aspx?ForumID=188&SiteID=7

    > のほうが適切かも。

    ExpressEditionの仕様ではなくプログラミングに関する質問だからこっちのほうがいいと思ったんですが・・・。

     

    > >親プロセスと同じフォルダになってしまいます。

    > はどのようにして確認していますか?

    > また、カレントフォルダはどこになりますか?

    下にコードサンプルを置きます。

    コード ブロック

    /* strCdは親プロセスのカレントフォルダ、

    strTmpPathは一時フォルダのパス(GetTempPath()で取得)、

    strExePathは実行するExeファイル(strTmpPathに置かれている)のフルパス、

    GameTitleはIniファイルから読み込んだ文字列です。 */

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    if(CreateProcess(strExePath, NULL, NULL, NULL, FALSE, 0, NULL, strCd, &si, &pi)) {
     WaitForSingleObject(pi.hProcess, INFINITE);
     CloseHandle(pi.hProcess);
     CloseHandle(pi.hThread);
    } else MessageBox(NULL, TEXT("ERROR"), GameTitle, MB_ICONSTOP);

    /* 本来ならstrCdに置かれているIniファイルを読むはずなのに読んでくれません。

    しかしstrTmpPathにIniファイルを置いたら読みました。 */

     

    2007年11月12日 6:16
  •  ルファー さんからの引用

    本来ならstrCdに置かれているIniファイルを読むはずなのに読んでくれません。

    もしかして、GetPrivateProfileXxx API にファイル名だけを渡して処理していませんか?

    であれば、APIの使い方が間違っています。

     

    このAPIは、原則として、INIファイルをフルパスで渡すという仕様になっています。

    ファイル名だけの場合は、EXEのあるフォルダ->Windowsディレクトリという順に検索を行うようになっていたと記憶しております。

    #もしかしたら検索順は逆かもしれませんが...

     

    なので、呼び出したアプリ側で、カレントディレクトリを読み取り、そのディレクトリをフルパスで指定する必要があると思います。

     

    2007年11月12日 7:41
  •  とっちゃん さんからの引用

    なので、呼び出したアプリ側で、カレントディレクトリを読み取り、そのディレクトリをフルパスで指定する必要があると思います。

    なるほどそうなんですかー。

    呼び出すアプリは他社が作ったもので、アプリ自体に手を加えるのは出来ないので

    IniファイルをstrTmpPathに置いて試してみます。
    2007年11月12日 10:43