<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Vorgehensweise bei der technischen Prüfung oder Zeichnungserstellung:</title>
</head>
<body bgcolor="#FFFFFF">
<p>Hallo, ich habe da ein Problem. Mein Programm darf nur einmal
gestartet werden. Deshalb hab ich aus dem Buch <em><strong>C++Builder
im Team</strong></em> den nachstehenden Code übernommen.
Funktioniert wunderbar, bis auf einen Schönheitsfehler: Es gibt
einen Unterschied, ob das Programm aus einer Application via
WinExec oder ShellExecute aufgerufen, oder ob es im
Windows-Startmenü angeklickt wurde! Also, ich kann mein Programm
einmal im Startmenü anwählen. Beim zweitenmal funktioniert der
Code. Wenn ich es nun zusätzlich via ShellExecute starte, habe
ich zwei Instanzen! Beim zweiten ShellExecute kommt aber keine
dritte Instanz. Umgekehrt, wenn ich zuerst via ShellExecute
starte, kann ich das Programm aus dem Startmenü auch noch
aufrufen. Wie kommt das ? Danke - Günther</p>
<pre>
<strong>char</strong> *<font color="#0000FF"><strong>GetPrevInstMutexName</strong></font>(<strong>void</strong>)
{
<strong>char</strong> *WindowBuf=(<strong>char</strong> *) <font
color="#0000FF">malloc</font>(MAX_PATH);
<strong>char</strong> *s=(<strong>char</strong> *) <font
color="#0000FF">malloc</font>(MAX_PATH);
<font color="#0000FF">GetWindowText</font>(Application->Handle,WindowBuf,MAX_PATH);
<font color="#0000FF">strcpy</font>(s," PREVINST: "
<font color="#0000FF">strcat</font>(s,WindowBuf);
<strong>return</strong>(s);
}
WINAPI <font color="#0000FF"><strong>WinMain</strong></font>(HINSTANCE, HINSTANCE HI, LPSTR, <strong>int</strong>)
{
<strong>int</strong> Mutex=(<strong>int</strong>)<font
color="#0000FF">CreateMutex</font>(NULL,true,<font
color="#0000FF"><strong>GetPrevInstMutexName</strong></font>());
<strong>if</strong>((Mutex!=NULL) && (<font
color="#0000FF">GetLastError</font>()==0))
{
// <font color="#008000"><strong>normale Programmausführung</strong></font>
}
<strong>else</strong>
{
// <font color="#008000"><strong>Programm läuft bereits</strong></font>
}
}
</pre>
</body>
</html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Vorgehensweise bei der technischen Prüfung oder Zeichnungserstellung:</title>
</head>
<body bgcolor="#FFFFFF">
<p>Hallo, ich habe da ein Problem. Mein Programm darf nur einmal
gestartet werden. Deshalb hab ich aus dem Buch <em><strong>C++Builder
im Team</strong></em> den nachstehenden Code übernommen.
Funktioniert wunderbar, bis auf einen Schönheitsfehler: Es gibt
einen Unterschied, ob das Programm aus einer Application via
WinExec oder ShellExecute aufgerufen, oder ob es im
Windows-Startmenü angeklickt wurde! Also, ich kann mein Programm
einmal im Startmenü anwählen. Beim zweitenmal funktioniert der
Code. Wenn ich es nun zusätzlich via ShellExecute starte, habe
ich zwei Instanzen! Beim zweiten ShellExecute kommt aber keine
dritte Instanz. Umgekehrt, wenn ich zuerst via ShellExecute
starte, kann ich das Programm aus dem Startmenü auch noch
aufrufen. Wie kommt das ? Danke - Günther</p>
<pre>
<strong>char</strong> *<font color="#0000FF"><strong>GetPrevInstMutexName</strong></font>(<strong>void</strong>)
{
<strong>char</strong> *WindowBuf=(<strong>char</strong> *) <font
color="#0000FF">malloc</font>(MAX_PATH);
<strong>char</strong> *s=(<strong>char</strong> *) <font
color="#0000FF">malloc</font>(MAX_PATH);
<font color="#0000FF">GetWindowText</font>(Application->Handle,WindowBuf,MAX_PATH);
<font color="#0000FF">strcpy</font>(s," PREVINST: "
<font color="#0000FF">strcat</font>(s,WindowBuf);
<strong>return</strong>(s);
}
WINAPI <font color="#0000FF"><strong>WinMain</strong></font>(HINSTANCE, HINSTANCE HI, LPSTR, <strong>int</strong>)
{
<strong>int</strong> Mutex=(<strong>int</strong>)<font
color="#0000FF">CreateMutex</font>(NULL,true,<font
color="#0000FF"><strong>GetPrevInstMutexName</strong></font>());
<strong>if</strong>((Mutex!=NULL) && (<font
color="#0000FF">GetLastError</font>()==0))
{
// <font color="#008000"><strong>normale Programmausführung</strong></font>
}
<strong>else</strong>
{
// <font color="#008000"><strong>Programm läuft bereits</strong></font>
}
}
</pre>
</body>
</html>
Comment