- 締切済み
Visual C++でのCreateMutex
次のようなプログラムで、ある実行ファイルが既に起動しているかどうかをチェックしています。 hMutex=CreateMutex(NULL, TRUE, "filename"); if(GetLastError() == ERROR_ALREADY_EXISTS){ A } else{ B } C++で作成したファイルが起動していると、Aの方に抜けて、起動をとらえられるのですが VBで作成したファイルは起動していても、Bの方に抜けて、起動をとらえられません。 何が悪いのでしょうか?
- aki2004-09-08
- お礼率68% (15/22)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chie65535
- ベストアンサー率43% (8523/19372)
>何が悪いのでしょうか? http://d.hatena.ne.jp/cjohn/20081204/1228397004 の「罠2」「罠3」をご参照下さい。 罠2の意味は「CreateMutexがNULLを返しと、エラー原因がERROR_ALREADY_EXISTSにならない」って事です。 罠3の意味は「他のユーザーで既に起動していると、起動しているのを捕捉できない」って事です。
関連するQ&A
- 2重起動を防ぐために
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW; MSG ms; HANDLE hMutex; hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS)return FALSE; とすればよいいうサイトがあります。 こうした後、最終的にこのアプリを終了するときMutexを閉じる必要はあるのでしょうか。 アプリの終了で自動的に閉じられるから何もしなくてよいのでしょうか教えてください。
- ベストアンサー
- C・C++・C#
- PostMessageがERROR_ALREADY_EXISTS終了
Windows2000 SP3上で動作するDLLを作成しています。 (先方のご都合でSP4ではなくSP3です) そのDLLではPostMessage関数でメッセージを同じウィンドウへ繰り返し送っているのですが、突然、PostMessage関数がERROR_ALREADY_EXISTS終了してしまう現象が発生してしまいます。 そこでご教示頂きたいのですが、PostMessage関数がERROR_ALREADY_EXISTS終了する原因はどんなことが考えられるのでしょうか? 通常、ERROR_ALREADY_EXISTS終了はCreateMutex関数などで同じ名前のオブジェクトがある場合に返されるエラーだと認識しているのですが、PostMessage関数で発生する原因が掴めずに困っています。 以下、ソースですが、単純にPostMessage失敗時にGetLastErrorを行っているだけです... bReturn = PostMessage(hWnd, uMsg, (WPARAM)NULL, (LPARAM)lplMsg); if (bReturn == FALSE) { lasterror = GetLastError(); // エラー処理 } 以上、よろしくお願い致します。
- 締切済み
- C・C++・C#
- 2重軌道防止のサイトの説明
に従って以下のようにしましたが 2重起動を発見してやめるために return false; としていますが return true; としたり booleanをやめて return int(0) とするとどうなるのでしょうか? WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW,hPW; MSG ms; unsigned pos; HANDLE hMutex; hPW=FindWindow("goo","I am good."); hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS) { ShowWindow(hPW,SW_RESTORE); SetForegroundWindow(hPW); return FALSE; } ・・・・・・・・・・・・・・・・・・・・
- ベストアンサー
- C・C++・C#
- ウィンドウタイトルの取得方法
WIN98 MFC vc++6.0 2重起動を防止し、既に起動している時は、ウィンドウを最上位にもってくる以下のコードにて ウィンドウのタイトルを設定しているIDS_WINDOWTITLEはどこで定義し、どうやってタイトルを設定すれば良いのでしょうか? BOOL CMyApp::InitInstance() { 略 // アプリケーションの二重起動防止 ::CreateMutex(NULL, TRUE, m_pszExeName); if( GetLastError() == ERROR_ALREADY_EXISTS) { // 既に起動されている場合は、CWnd::FindWindow関数を使って // 起動されているアプリケーションのウィンドウを取得し、 // そのウィンドウを最上位へ持ってくる CString str; str.LoadString(IDS_WINDOWTITLE); // IDS_WINDOWTITLEにはウィンドウのタイトルを設定している CWnd* pWnd = CWnd::FindWindow(NULL, str); if( pWnd ) pWnd->SetForegroundWindow(); return FALSE; }
- ベストアンサー
- C・C++・C#
- C言語で前面表示や、特定のファイル検索方法を教えてください!
VBで作ったソフトを、今C言語で作り変えています。 そのソフトは前面表示になっており、プログラムの始めに、特定のファイルがあるかどうか調べています。 ネット上で探しているのですが、見つかりません。 知っている人がいれば、どうか教えてください。 後、VBでファイルを調べるプログラムは、 If System.IO.File.Exists(ファイル名) = True Then あった場合に動作させるプログラム Else 無かった場合に動作させるプログラム End If です。
- ベストアンサー
- C・C++・C#
- C# ネット上のファイルの有無確認
string fileName = @"C:\test.txt"; if (System.IO.File.Exists(fileName)) { MessageBox.Show("'" + fileName + "'は存在します。"); } else { MessageBox.Show("'" + fileName + "'は存在しません。"); } このようなC#ソースを見つけたので、これをネット上のファイルの有無確認に転用したいです。 string fileName = @"http://cmm001.goo.ne.jp/img/logo/goo.gif"; このように変更しても確認は出来ないようです。 指定方法を教えて下さい。
- 締切済み
- C・C++・C#
- Visual Basic 2005で困ってます
「ファイルを開く」ダイアログを表示して 画像ファイルを選択し、そのファイルをPictureboxに表示させたいのですが 画像が表示されずエラーが出てしまいます。 Private Sub 開くOToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click Dim ofd As New OpenFileDialog() ofd.FileName = "" ofd.InitialDirectory = "デスクトップ" ofd.Filter = _ "すべてのピクチャーファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|すべてのファイル(*.*)|*.*" ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then Console.WriteLine(ofd.FileName) lstFileName.Items.Add(ofd.FileName) End If このようなプログラムなのですが どのように変えたらよろしいでしょうか? 教えてください、よろしくお願いします。
- ベストアンサー
- Visual Basic
- C言語でのファイル操作について(初心者)
ファイル操作について教えてほしいのですが、 例えば、(極端な話ですが) AさんがBさんに飴玉をあげたのが分かったら ファイルにAさんとBさんの組を登録し、 Aさんのカウンタを1つ増やす。 そしてBさんがAさんにお返しに飴玉をあげたら Aさんのカウンタを1つ減らす。 お返しをしなかったらAさんのカウンタは1のまま というようなプログラムを作成したいんですが どうやったらいいのかわかりません。誰か分かる人が いらっしゃいましたらご教授お願いします。 if(AさんがBさんに飴玉をあげたのが分かったら) { FILE *fp; fp = fopen("filename", "a"); fprintf(fp, "A"); /* filenameというファイルにAとBの組を登録*/ fprintf(fp, " B\n"); ---filenameの中--------------------- あげた人:A もらった人:B A=1 ------------------------------------ というように計算しようとしています お願いします。
- ベストアンサー
- C・C++・C#
- vbsにてファイルが存在すればメッセージを表示する。というプログラムを作成したいです。
vbsにてファイルが存在すればメッセージを表示する。というプログラムを作成したいのですが 普通にexistsを使ってプログラムを作ったのですが たとえばif文このファイルがあれば~ という分岐の次にまたこのファイルがあれば~という分岐をして4つくらいのファイルがすべて存在すればあるメッセージを表示する。というプログラムを作成したいのですが・・・つまりelseと逆にtrueなら次の分岐・・・という風に作成したいのです。どうかよろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- C言語
#include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。