C++ Builder Snippets  

Der ggf. bereits aktiven Programminstanz Kommandozeilenparameter übergeben:
 
Manchmal ist es notwendig, dass die Anwendung nach dem Programmstart zunächst einmal überprüft, ob nicht bereits eine frühere Instanz dieses Proggramms aktiv ist, ggf. die frühere Instanz in Vordergrund bringt, ihr die eigenen Kommandozeilenparameter übergibt und sich beendet.

Der Beispielcode für das Unterbinden der mehrfachen Programmausführung befindet sich hier.

Dieser muss nun um die Übergabe der Kommandozeileparameter an die erste Programminstanz ergänzt werden.

Die Übergabe der Parameter wird im folgenden Beispiel mit Hilfe der Windows-Botschaft WM_COPYDATA realisiert.
--- projektname.cpp ---
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR cmdLine, int)
{
  try
  {
    // Versuche, Mutex zu öffnen:
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "MyApp1.0");

    // Falls hMutex ist 0, Mutex erzeugen:
    if (!hMutex)
      hMutex = CreateMutex(0, 0, "MyApp1.0");
    else
    {
      // Es ist die zweite Instanz. Aktiviere die erste Instanz:
      HWND hWnd = FindWindow(0, "Form1");
      SetForegroundWindow(hWnd);

      //************************************************
      // Kommandozeile nicht leer. Sende die 
      // Kommandozeile an die laufende 
      // Programminstanz in einer WM_COPYDATA Message:
      if (strlen(cmdLine) != 0)
      {
        COPYDATASTRUCT cds;
        cds.cbData = strlen(cmdLine) + 1;
        cds.lpData = cmdLine;
        SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
      }
      return 0;
      //************************************************
    }
    Application->Initialize();
    Application->CreateForm(__classid(TForm1), &Form1);
    Application->Run();

    ReleaseMutex(hMutex);
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
  return 0;
}

Im eigentlichen Programmcode muss auf die Message reagieret werden.
Zum Beispiel so:

--- form1.h ---
...
private:
  //************************************************
  // Eventhandler für die WM_COPYDATA deklarieren:
  void __fastcall WmCopyData(TWMCopyData& Message);
  //************************************************
public:
  __fastcall TForm1(TComponent* Owner);

  //************************************************
  // Messagehandling deklarieren:
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_COPYDATA, TWMCopyData, WmCopyData)
  END_MESSAGE_MAP(TForm)
  //************************************************
};

--- form1.cpp ---
...
//************************************************
// Der Eventhandler für die WM_COPYDATA:
void __fastcall TForm1::WmCopyData(TWMCopyData& Message)
{
  AnsiString slCmdLine =
    (char*)Message.CopyDataStruct->lpData;
  slCmdLine = slCmdLine + '\0';

  // Den Code hier einfügen... z.B.:
  ShowMessage(slCmdLine);
}
//************************************************



© '99-2001 by S. Kreutzmann