こんにちわ。
WindowsXP
VC++6.0 ダイアログベースで
アプリケーションを作成して、
そのAAA.exeファイルを二重起動防止するのはCMutexでできました。
しかし、AAA.exeをコピーし、bbb.exeと名前を変更して、
両方起動したい。
しかし名前を変えても1つしか起動しなくなってしまいます。
両方起動し、かつ同じexeは二重起動防止する方法ありますか?
CMutexの名前にEXEのファイルパスを使ってみては。
> 両方起動し、かつ同じexeは二重起動防止する方法ありますか?
何をもって「両方」、何をもって「同じ」という定義は考えていただくとして、
> しかし名前を変えても1つしか起動しなくなってしまいます。
CMutexによる排他は、CMutexの引数に渡す名前で識別してます。
実行ファイルの名前を変えても、ここに同じものを渡せば排他されるでしょう。
実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソース
名をつける必要があります。
>CMutexの名前にEXEのファイルパスを使ってみては。
このやり方でやるとエラーで落ちました。
>CMutexによる排他は、CMutexの引数に渡す名前で識別してます。
>実行ファイルの名前を変えても、ここに同じものを渡せば排他されるでしょう。
それはわかってるのですが、以下のやり方なら名前を変えても平気だと思うのですが
だめでした。
CString MutexName;
char pass[256];
GetModuleFileName(NULL, pass, sizeof(pass));
MutexName.Format(20060823 %s,pass);
CMutex mutex(FALSE,MutexName);
>実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソース
>名をつける必要があります。
ってことは、実行ファイルのフルパスを引数に渡してあげれば可能ということですよ
ね?
>>実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソー
ス
>>名をつける必要があります。
> ってことは、実行ファイルのフルパスを引数に渡してあげれば可能ということですよ
ね?
いいえ。私の書いている意図は違います。
実行ファイルのフルパスを使うのであれば、
実行ファイルのフルパスを「元にした名前」をつける必要があると書きました。
::CreateMutexには「バックスラッシュが渡せない」とかいろいろあると思いますが、
MSDNは確認されてますか。
>::CreateMutexには「バックスラッシュが渡せない」とかいろいろあると思いますが
なるほど!だからできなかったのですね!
CString MutexName;
char pass[256];
char fname[64];
GetModuleFileName(NULL, pass, sizeof(pass));
_splitpath(pass, NULL, NULL, fname, NULL);
MutexName.Format(20060823 %s,fname);
CMutex mutex(FALSE,MutexName);
この方法でできました。
ありがとうございました。
これだと
AAA.exeを別のフォルダやドライブに「名前を変えずに」コピーした場合起動できません
が
実行ファイル名が同じなら「同じexe」とみなして実行禁止でよいのですか?
# こっちの問題ですね。
> 何をもって「両方」、何をもって「同じ」という定義は考えていただくとして、
バックスラッシュを別の文字(スラッシュなど)に置き換える、とか。
あと、ミューテックス名は大文字小文字が区別されるので、パス名を
大文字または小文字に変換しておいたほうが良いと思います。
CString mutexName;
GetModuleFileName(NULL, mutexName.GetBuffer(MAX_PATH - 1), MAX_PATH);
mutexName.ReleaseBuffer();
mutexName.Replace(_T('\\'), _T('/'));
mutexName.MakeUpper();
CMutex mutex(FALSE, mutexName);