二重起動防止について – プログラミング – Home

通知
すべてクリア

[解決済] 二重起動防止について


大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

こんにちわ。
WindowsXP
VC++6.0 ダイアログベースで
アプリケーションを作成して、
そのAAA.exeファイルを二重起動防止するのはCMutexでできました。
しかし、AAA.exeをコピーし、bbb.exeと名前を変更して、
両方起動したい。
しかし名前を変えても1つしか起動しなくなってしまいます。
両方起動し、かつ同じexeは二重起動防止する方法ありますか?


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

CMutexの名前にEXEのファイルパスを使ってみては。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 両方起動し、かつ同じexeは二重起動防止する方法ありますか?

何をもって「両方」、何をもって「同じ」という定義は考えていただくとして、

> しかし名前を変えても1つしか起動しなくなってしまいます。

CMutexによる排他は、CMutexの引数に渡す名前で識別してます。
実行ファイルの名前を変えても、ここに同じものを渡せば排他されるでしょう。

実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソース
名をつける必要があります。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>CMutexの名前にEXEのファイルパスを使ってみては。
このやり方でやるとエラーで落ちました。

>CMutexによる排他は、CMutexの引数に渡す名前で識別してます。
>実行ファイルの名前を変えても、ここに同じものを渡せば排他されるでしょう。
それはわかってるのですが、以下のやり方なら名前を変えても平気だと思うのですが
だめでした。
CString MutexName;
char pass[256];

GetModuleFileName(NULL, pass, sizeof(pass));
MutexName.Format(20060823 %s,pass);
CMutex mutex(FALSE,MutexName);

>実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソース
>名をつける必要があります。
ってことは、実行ファイルのフルパスを引数に渡してあげれば可能ということですよ
ね?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

>>実行ファイルの名前で排他したいなら、CMutexには実行ファイルの名前を元にリソー

>>名をつける必要があります。
> ってことは、実行ファイルのフルパスを引数に渡してあげれば可能ということですよ
ね?

いいえ。私の書いている意図は違います。

実行ファイルのフルパスを使うのであれば、
実行ファイルのフルパスを「元にした名前」をつける必要があると書きました。

::CreateMutexには「バックスラッシュが渡せない」とかいろいろあると思いますが、
MSDNは確認されてますか。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>::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);

この方法でできました。
ありがとうございました。


返信引用
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 24年前
投稿: 92
 

これだと
AAA.exeを別のフォルダやドライブに「名前を変えずに」コピーした場合起動できません

実行ファイル名が同じなら「同じexe」とみなして実行禁止でよいのですか?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# こっちの問題ですね。
> 何をもって「両方」、何をもって「同じ」という定義は考えていただくとして、


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

バックスラッシュを別の文字(スラッシュなど)に置き換える、とか。

あと、ミューテックス名は大文字小文字が区別されるので、パス名を
大文字または小文字に変換しておいたほうが良いと思います。

CString mutexName;
GetModuleFileName(NULL, mutexName.GetBuffer(MAX_PATH - 1), MAX_PATH);
mutexName.ReleaseBuffer();
mutexName.Replace(_T('\\'), _T('/'));
mutexName.MakeUpper();

CMutex mutex(FALSE, mutexName);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました