【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

カレントディレクトリを変更するラッパー

ちょっとした必要に迫られてカレントディレクトリを変更するラッパーを作りました。
exeファイルの場所をカレントディレクトリにして、同じディレクトリにある"_orig"を付加した名前のexeを呼び出します。引数は転送されます。Windows専用です。

使用例

C:\Program Files\foo\bar.exe

  • カレントディレクトリ: C:\Program Files\foo
  • 実行ファイル: C:\Program Files\foo\bar_orig.exe

ソース

ライセンス: パブリックドメイン

#define UNICODE
#include <windows.h>
#include <string>

typedef std::basic_string<TCHAR> TString;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPSTR lpCmdLine, int nCmdShow)
{
  TCHAR buf[MAX_PATH];
  GetModuleFileName(NULL, buf, MAX_PATH);
  TString mfn = buf;
  TString dir = mfn.substr(0, mfn.rfind('\\'));
  TString exe = mfn.substr(0, mfn.rfind('.')) + TEXT("_orig.exe");

  LPTSTR cmdl = GetCommandLine();
  LPTSTR arg = cmdl;
  bool dq = false;
  for (LPTSTR p = cmdl; *p != 0; p++)
  {
    if (*p == '\"')
    {
      dq = !dq;
    }
    else if (!dq && *p == ' ')
    {
      arg = p + 1;
      break;
    }
  }
  TString cmd = TEXT("\"") + exe + TEXT("\" ") + arg;

  STARTUPINFO sinfo;
  GetStartupInfo(&sinfo);
  PROCESS_INFORMATION pinfo;
  return CreateProcess(NULL, (LPTSTR)cmd.data(), NULL, NULL, FALSE,
    0, NULL, dir.data(), &sinfo, &pinfo);
}