拡張子を取り除くには?

解決


みる  2004-12-04 21:57:44  No: 55448

実行ファイル等のフルパスを、char[128]型等の変数に格納しているのですが、その拡張子の部分だけを取り除きたいのです。
.exeの部分を取り除いたパスを変数に格納する良い方法をご教授下さい。


(noname)  2004-12-05 03:00:20  No: 55449

俺なら単純に,こんなコードにするね ( ´Д`)y-~~

  char path[128];
  int rindex = (int)GetModuleFIlaName(NULL, path, 128);
  if (rindex == 0) return; // API呼び出し失敗
  while (rindex-- > 0) {
    if (path[rindex] == '.') break;
  }
  if (rindex < 0) return; // 拡張子がない(そんな事があるのかどうかは知らねーけど)
  path[rindex] = '\0';

このコードは "C:\module.foo.exe" を "C:\module.foo" にする。
"C:\.exe" なら "C:\" だけになるなw
Shift JIS に悩む必要もねーから安心しな。
それから _splitpath() つーのも調べてみ ( ´Д`)y-~~


みる  2004-12-05 04:47:36  No: 55450

>(noname)さん
上記のようなコードを記述して、.exeの部分を取り除く事ができました。  ありがとうございます。

実は、システムフックを使って、F1等を押したら指定したパスのファイルをShellExecute関数で実行するような事をしていたんですけど、それをやると実行ファイルが二重に起動してしまうので、.exeの部分をとればいいのかなと思ったのですが、だめでした。
なぜ二重になってしまうのか分かる方がいらっしゃいましたら、ご教授願います。  

SetWindowsHookEx(hHook, WH_KEYBOARD, hInstance, NULL);
LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
.....
if(wp==VK_F1)
    ShellExecute(NULL, "open", szPath, NULL, NULL, SW_SHOWNORMAL);


なーめ  2004-12-05 05:29:00  No: 55451

質問の回答ではないけど、
>> char[128]
これは良くない。
char a[MAX_PATH];
とすべき。
MAX_PATH は 私のところ(VC++6.0/Win2K)で 260 になっている。
そんなに深いところに EXE を置くことはないかもしれないが、
習慣づけておかないと、いざというときにはまるよ。


みる  2004-12-05 06:10:40  No: 55452

>なーめさん
ありがとうございます。  これからは128よりも大きい配列を宣言するようにします。

質問の件ですが、自己解決できました^^;
どうやら、WH_KEYBOARDの場合だとKEYDOWNとKEYUPが重なってしまい、結果として二度実行されるみたいです。  WH_KEYBOARD_LLを指定して、WM_KEYDOWNに対してグローバルフックを行うと一度しか実行されませんでした。
ご教示してもらって感謝しています。


RAPT  2004-12-06 07:01:29  No: 55453

shlwapiなら、PathRemoveExtension()というそのものズバリなAPIがある。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加