フリーソフト

« 2006年2月 | トップページ | 2006年4月 »

[BCB] caseでローカル変数の初期化がとばされた?

switch文のcaseでローカル変数を以下のように使おうとすると、「caseでローカル変数の初期化がとばされた」というようなエラーメッセージが表示されてしまいます。

switch (Value) {
case 0:
  int i=0;
     :
  break;
default:
     :
  break;
}

このようなことをしたいときは時は次のようにcaseの中をブレースで括ります。

switch (Value) {
case 0:
  {
  int i=0;
     :
  break;
  }
default:
     :
  break;
}

[BCB] EnumWindowsでコンパイルが通らない

ウインドウの一覧を得るEnumWindowsというAPIがありますが、C++Builder6.0でこの関数を使用すると以下のようなエラーがでる場合があるようです。

----
E2034 'int (__stdcall *)(void *,long)'型は'int (__stdcall *)()'型に変換できない
E2342 パラメータ 'EnumWndProc' は int (__stdcall *)() 型として定義されているので int (__stdcall *)(void *,long) は渡せない
----

以下のように強制的にキャストをかけてしまえばコンパイルできるようになります。きちんと意図した動作もしているようです。

//関数の定義
BOOL CALLBACK EnumWndProc(HWND hWindow,LPARAM lData)
{
   :
}

//呼び出し
EnumWindows((WNDENUMPROC)EnumWndProc,0);

[BCB] アプリの2重起動を禁止する

Mutexを使用して、アプリケーションの2重起動を禁止する方法です。「プロジェクト」-「ソース表示」で表示されるファイルに以下のようなコードを追記します。

=====

#define MUTEX_ID "Unique_ID_String"  //適当な文字列を設定

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {

    HANDLE  hMutex=NULL;

    //2重起動のチェック

    //Mutexを作成してみる
    hMutex = CreateMutex(NULL, true, MUTEX_ID);
    if (hMutex!=NULL) {
      if (GetLastError()==ERROR_ALREADY_EXISTS) { //すでに起動されている
        CloseHandle(hMutex); // 閉じる
        ReleaseMutex(hMutex);// 破棄する

        //すでに起動済みの画面を探して前面に持ってくる処理などを書く

        return 0; //終了
      }
    } else {
      //Mutexの作成に失敗したときの処理
    }

    //この辺はもともと書かれている部分
    Application->Initialize();
       :
    Application->Run();

    //最後に後始末
    CloseHandle(hMutex); // 閉じる
    ReleaseMutex(hMutex); //ミューテクス解除
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
       :
  return 0;
}

« 2006年2月 | トップページ | 2006年4月 »