INFO

SwyxIt! v4.0 Client SDK (kb2288)

Die Information in diesem Artikel betrifft die folgenden Produkte:

  • SwyxIt! v4.02
  • SwyxIt! v4.01
  • SwyxIt! v4.00

[ Zusammenfassung | Information | Referenzen ]


Zusammenfassung

SwyxIt! bietet zwei Schnittstellen für die Steuerung von Anrufen:

  • Client SDK (ein COM Interface)
  • TAPI (SwyxIt! TSP unterstützt TAPI 2.x)

Falls keine besonderen Gründe (zum Beispiel eine bereits existierende TAPI Applikation) für die Verwendung des TAPI-Interface sprechen, empfehlen wir den Einsatz des Client SDK. Über das Client SDK stehen Ihnen nahezu alle Funktionen der Anrufbehandlung offen.


Information

Das SwyxIT! Client SDK ist versionabhängig. Weitere SDK Versionen finden Sie hier:

 

Die zentrale Einheit auf einem Client PC ist der Client Line Manager (CLMgr.exe). Alle Applikationen wie SwyxIt!, Swyx Client TSP, Swyx Outlook Addin und auch potentielle Software von Drittanbietern setzen auf dem Client Line Manager auf. Hierzu bietet der Client Line Manager ein COM Interface an, über den die Leitungen gesteuert werden können (Rufe aufbauen, Makeln, ...). Auf diese Weise können verschiedene Applikationen dieselben Leitungen zeitgleich benutzen. Ein Ruf kann zum Beispiel über das Outlook Addin aufgebaut und anschließend über SwyxIt! gemakelt werden. Aktionen wie Abheben, Wählen, Makeln werden über Methoden des COM Interfaces aufgerufen, Zustandsänderungen von Leitungen etc. werden vom Client Line Manager als COM Events oder als Window Messages an ein Fenster oder einen Thread der Client Applikation versendet.

Das Client SDK enthält eine dokumentierte Interface Definition (CLMgrPub.idl) und einige Beispiel-Applikationen in Visual C++, Visual Basic und Visual Basic Skript.

Verzeichnis PublicInterface:

CLMgrPub.idl:
Definition der öffentlichen Schnittstelle
CLMgrPubTypes.c:
Definition der erforderlichen GUIDs (für Visual C++)
CLMgrPubTypes.h:
Einige Typen und Aufzählungen, die als Rückgabewerte verwendet werden

Verzeichnis Samples:

Visual Basic Simple:
Einfache Visual Basic Applikation
Zeigt Informationen über die selektierte Leitung an.
Erlaubt einfache Rufbehandlung.
Visual Basic Script:
Sehr einfaches Beispiel.
Zeigt, wie ganz einfach eine Rufnummer gewählt werden kann.
Visual C++ Simple:
Einfache Visual C++ Applikation
Dialog basierte MFC Applikation
Zeigt Informationen über die selektierte Leitung an.
Erlaubt einfache Rufbehandlung.
Visual C++ Call Log:
Einfache Visual C++ Applikation
Dialog basierte MFC Applikation
Protokolliert kommende und gehende Rufe
Visual C++ ATL PlugIn:
Einfache Visual C++ Applikation
Basiert auf der Active Template Library.
Zeigt die Implementierung eines Line Manager Plugin.
Erlaubt Namensauflösung für SwyxIt!.

Verwendung des Client SDK mit verschiedenen Programmiersprachen

Visual Basic

Unter Visual Basic 6 kann das Client SDK unter dem Menü Project\References hinzugefügt werden. Markieren Sie in dem entsprechenden Dialog die Bibliothek "CLMgr 2.0 Type Library". Danach stehen Ihnen im Object Browser unter CLMGRLib alle verfügbaren Objekte und Methoden zur Verfügung. Aus technischen Gründen sehen Sie im Object Browser allerdings wesentlich mehr Objekte und Interfaces als Ihnen für die Programmierung zur Verfügung stehen. Aus Visual Basic heraus können Sie die Objekte ClientLineMgr und ClientLine und deren Disp-Methoden und -Eigenschaften verwenden, wobei Sie nur das ClientLineMgr explizit erzeugen:

Public WithEvents PhoneLineMgr As CLMGRLib.ClientLineMgr
Set PhoneLineMgr = CreateObject("CLMgr.ClientLineMgr")

ClientLine Objekte erzeugen Sie nicht direkt, sondern Sie greifen über das ClientLineMgr Objekt auf die Leitungen zu. Im folgenden Beispiel wird vom Client Line Manager die selektierte Leitung (Leitung im Fokus) abgefragt und auf Halten gelegt:

Public PhoneLineFocus As Object
Set PhoneLineFocus = PhoneLineMgr.DispSelectedLine
PhoneLineFocus.DispHold

Es folgt eine Auswahl der Methoden und Eigenschaften des ClientLineMgr Objektes. Eine genaue Beschreibung finden Sie in der Datei CLMgrPub.idl. Das Lesen einer idl-Datei ist für Visual Basic Entwickler zwar etwas unüblich. Wenn Sie aber gleichzeitig die entsprechenden Methoden im Object Browser betrachten, sollte die idl-Syntax verständlich sein.

An- und Abmeldung

Alle Applikationen, die sich selbst am SwyxServer anmelden, müssen folgende Funktionen aufrufen:
Beim Start: PubInit und PubRegisterUser
Beim Beenden: PubReleaseUser
Andernfalls wird sich der Client Line Manager nicht beenden und der Anwender ist eventuell noch am SwyxServer angemeldet.

Wichtig: Die An- und Abmeldung ist für die meisten Applikationen nicht erforderlich. Solange SwyxIt! auch ausgeführt wird, erfolgt die An- und Abmeldung bereits über SwyxIt! und Ihre Applikation sollte sich weder an- noch abmelden. Solange SwyxIt! läuft und angemeldet ist, können Sie alle Methoden des Client SDK verwenden. Das Beispiel "Visual Basic Simple" zeigt allerdings die Verwendung der An- und Abmeldung.

Initialisierung:DispInit(ServerName As String) As LongRückgabewert 0: kein Fehler. Andernfalls ist der Wert ein HRESULT Fehlercode.

Anmeldung:DispRegisterUser(UserName As String) As LongRückgabewert: user id. Wenn 0 zurückgegeben wird, ist ein Fehler aufgetreten.

Abmeldung:DispReleaseUser(UserId As Long) As Long

Zugriff auf Leitungen, Makeln, ...

Zugriff auf Leitung Nr. iLineNumber. 1. Leitung hat Index 0!DispGetLine(iLineNumber As Long) As Object

Nummer der selektierten Leitung. 1. Leitung hat Index 0!DispSelectedLineNumber As Long

Zugriff auf selektierte Leitung:DispSelectedLine As Object

Makeln auf Leitung iLineNumber. 1. Leitung hat Index 0!DispSelectLineNumber(iLineNumber As Long) As Long

Makeln auf Leitung ClientLineDispSelectLine(pIClientLine As ClientLine) As Long

Wählen einer Nummer auf einer beliebigen LeitungDispSimpleDialEx(dialstring As String) As LongRückgabewert 0: die Rufnummer wurde gewählt. Andernfalls ist ein Fehler aufgetreten.

Auf einer Leitung können Sie Abheben, Wählen, auf Halten legen etc.:

Abheben:DispHookOff

Auflegen:DispHookOn

"Gabel drücken":DispPressHook

Wählen:DispDial(dialstring As String)

Auf Halten legen:DispHold

Aus dem Halten zurückholen:DispActivate

Zwei Leitungen verbinden:DispTransferCall(pITargetLine As Object);

Zustand abfragen:DispState As Long

0: nicht aktiv
1: abgehoben, interner Wählton
2: abgehoben, externer Wählton (Amt)
3: kommender Ruf, es klingelt
4: wählend
5: gehender Ruf, es klingelt beim Angerufenen
6: gehender Ruf, beim Angerufenen wird angeklopft
7: gehender Ruf, beim Angerufenen oder im ISDN oder im Gateway ist besetzt. Mehr Details in der Eigenschaft DispDiscReason
8: aktive Leitung
9: Leitung wird gehalten
10: aktive Konferenz
11: Konferenz wird gehalten
12: Ruf beendet. Mehr Details in der Eigenschaft DispDiscReason

 

Vom Server bestätigter Wählstring:DispAcknowledgedDialstring As String

Rufnummer des Gesprächspartners:DispPeerNumber As String

Name des Gesprächspartners:DispPeerName As String

Grund für Besetzt / Ruf beendet:DispDiscReason As Long

0: Normaler Verbindungsabbau
1: Angerufener ist besetzt
2: Ruf wurde vom Angerufenen abgelehnt
3: Ruf wurde abgebrochen
4: Ruf wurde übergeben
5: Ruf wurde zu Konferenz hinzugefügt
6: Angerufener hat sich nicht gemeldet, Zeit überschritten
7: Kommender Ruf wurde bereits durch anderes Endgerät angenommen
8: Direktruf nicht möglich
9: Ungültige Rufnummer
10: Ziel nicht erreichbar
11: Ruf wurde umgeleitet
12: Call Routing Fehler (Fehler im Skript des Angerufenen)
13: Keine Berechtigung für diesen Ruf
14: Öffentliches Telefonnetz überlastet
15: Kein Gateway-Kanal verfügbar
16: Die Rufnummer hat sich geändert
17: Inkompatible Gegenstelle (Sprach-Kompression)

 

Weitere Funktionen und Eigenschaften sind in der Datei CLMgrPub.idl dokumentiert.

Empfangen von Line Manager Events unter Visual Basic:

Definieren Sie ein ClientLineMgr Objekt:Public WithEvents PhoneLineMgr As CLMGRLib.ClientLineMgr

Erzeugen Sie ein Objekt:Set PhoneLineMgr = CreateObject("CLMgr.ClientLineMgr")

Fügen Sie folgende Funktion zu Ihrem Code hinzu, die die Events empfängt. Die Bedeutung des Parameters param ist in der Datei CLMgrPubTypes.h erläutert.

Sub PhoneLineMgr_DispOnLineMgrNotification(ByVal msg As Long, ByVal param As Long)
 Select Case msg
  Case PubCLMgrLineStateChangedMessage
  Case PubCLMgrLineSelectionChangedMessage
  Case PubCLMgrLineDetailsChangedMessage
  Case PubCLMgrCallDetailsMessage
  Case PubCLMgrServerDownMessage
  Case PubCLMgrServerUpMessage
  Case PubCLMgrWaveDeviceChanged
  Case PubCLMgrGroupCallNotificationMessage
  Case PubCLMgrClientShutDownRequest
  Case PubCLMgrNameKeyStateChangedMessage
  Case PubCLMgrNumberOfLinesChangedMessage
  Case PubCLMgrClientShutDownRequest
  Case PubCLMgrPowerSuspendMessage
  Case PubCLMgrPowerResumeMessage
  Case PubCLMgrHandsetStateChangedMessage
 End Select
End Sub

Visual Basic Skript

Hier wird das selbe Interface verwendet wie mit Visual Basic. Allerdings ist kein Empfangen von Events möglich.

Definieren der Objekte: Dim PhoneLineMgr : Set PhoneLineMgr = Nothing
Dim PhoneLineFocus : Set PhoneLineFocus = Nothing
Dim errval

Erzeugen des ClientLineMgr Objekts:Set PhoneLineMgr = Wscript.CreateObject("CLMgr.ClientLineMgr")

Wählen einer Rufnummer:errval = PhoneLineMgr.DispSimpleDial("001191")

Leitung im Fokus abfragen:Set PhoneLineFocus = PhoneLineMgr.DispSelectedLine

Leitung auf Halten legen:PhoneLineFocus.DispHold

Alle weiteren Informationen entnehmen Sie bitte dem Abschnitt über Visual Basic.

Visual C++

Beispiel "Visual C++ Simple"

Unter Visual C++ fügen Sie die Dateien CLMgrPubTypes.h, CLMgrPubTypes.c und CLMgrPub.idl zu Ihrem Projekt hinzu. Aus Visual C++ heraus können Sie ein Client Line Manager Objekt (CLSID_ClientLineMgr) erzeugen und dessen Interfaces IClientLineMgrPub und IClientLineMgrPub2 verwenden. Das Client Line Manager Objekt bietet Methoden zum Zugriff auf die Leitungen an. Mit dem Interface IClientLinePub können Sie Aktionen auf einer Leitung ausführen bzw. Information über eine Leitung abfragen. Dies sehen Sie im ersten Beispiel "Visual C++ Simple".

Es folgt eine Auswahl der Methoden und Eigenschaften des ClientLineMgr Objektes. Eine genaue Beschreibung finden Sie in der Datei CLMgrPub.idl.

An- und Abmeldung

Alle Applikationen, die sich selbst am SwyxServer anmelden, müssen folgende Funktionen aufrufen:
Beim Start: PubInit und PubRegisterUser
Beim Beenden: PubReleaseUser
Andernfalls wird sich der Client Line Manager nicht beenden und der Anwender ist eventuell noch am SwyxServer angemeldet.

Wichtig: Die An- und Abmeldung ist für die meisten Applikationen nicht erforderlich. Solange SwyxIt! auch ausgeführt wird, erfolgt die An- und Abmeldung bereits über SwyxIt! und Ihre Applikation sollte sich weder an- noch abmelden. Solange SwyxIt! läuft und angemeldet ist, können Sie alle Methoden des Client SDK verwenden. Das Beispiel "Visual C++ Simple" zeigt allerdings die Verwendung der An- und Abmeldung.

Initialisierung:HRESULT PubInit([in] BSTR ServerName); Rückgabewert 0: kein Fehler. Andernfalls ist der Wert ein HRESULT Fehlercode.

Anmeldung:HRESULT PubRegisterUser([in] BSTR UserName, [out] long *pUserId);Rückgabewert: user id. Wenn 0 zurückgegeben wird, ist ein Fehler aufgetreten.

Abmeldung:HRESULT PubReleaseUser([in] long UserId);

Zugriff auf Leitungen, Makeln, ...

Zugriff auf Leitung Nr. iLineNumber. 1. Leitung hat Index 0!HRESULT PubGetLine([in] long iLineNumber, [out] IClientLinePub** ppIClientLinePub);

Nummer der selektierten Leitung. 1. Leitung hat Index 0!HRESULT PubGetSelectedLineNumber([out] long *piLineNumber);

Zugriff auf selektierte Leitung:HRESULT PubGetSelectedLine([out] IClientLinePub** ppIClientLine);

Makeln auf Leitung iLineNumber. 1. Leitung hat Index 0!HRESULT PubSelectLineNumber([in] long iLineNumber);

Makeln auf Leitung pIClientLineHRESULT PubSelectLine([in] IClientLinePub* pIClientLine);

Wählen einer Nummer auf einer beliebigen LeitungHRESULT PubSimpleDial([in] BSTR dialstring);
Rückgabewert 0: die Rufnummer wurde gewählt. Andernfalls ist ein Fehler aufgetreten.

Auf einer Leitung können Sie Abheben, Wählen, auf Halten legen etc.:

Abheben:HRESULT PubHookOff();

Auflegen:HRESULT PubHookOn();

"Gabel drücken":HRESULT PubPressHook();

Wählen:HRESULT PubDial([in] BSTR dialstring);

Auf Halten legen:HRESULT PubHold();

Aus dem Halten zurückholen:HRESULT PubActivate();

Zwei Leitungen verbinden:HRESULT PubTransferCall([in] IClientLinePub* pITargetLine);

Zustand abfragen:HRESULT PubGetState([out] long *piState);

PubLSInactive:
nicht aktiv
PubLSHookOffInternal:
abgehoben, interner Wählton
PubLSHookOffExternal:
abgehoben, externer Wählton (Amt)
PubLSRinging:
kommender Ruf, es klingelt
PubLSDialing:
wählend
PubLSAlerting:
gehender Ruf, es klingelt beim Angerufenen
PubLSKnocking:
gehender Ruf, beim Angerufenen wird angeklopft
PubLSBusy:
gehender Ruf, beim Angerufenen oder im ISDN oder im Gateway ist besetzt. Mehr Details in PubCLMgrLineDetails
PubLSActive:
aktive Leitung
PubLSOnHold:
Leitung wird gehalten
PubLSConferenceActive:
aktive Konferenz
PubLSConferenceOnHold:
Konferenz wird gehalten
PubLSTerminated:
Ruf beendet. Mehr Details in PubCLMgrLineDetails

 

Grund für Besetzt / Ruf beendet:

PubSCl3DRNormal:
Normaler Verbindungsabbau
PubSCl3DRBusy:
Angerufener ist besetzt
PubSCl3DRRejected:
Ruf wurde vom Angerufenen abgelehnt
PubSCl3DRCancelled:
Ruf wurde abgebrochen
PubSCl3DRTransferred:
Ruf wurde übergeben
PubSCl3DRJoinedConference:
Ruf wurde zu Konferenz hinzugefügt
PubSCl3DRNoAnswer:
Angerufener hat sich nicht gemeldet, Zeit überschritten
PubSCl3DRTooLate:
Kommender Ruf wurde bereits durch anderes Endgerät angenommen
PubSCl3DRDirectCallImpossible:
Direktruf nicht möglich
PubSCl3DRWrongNumber:
Ungültige Rufnummer
PubSCl3DRUnreachable:
Ziel nicht erreichbar
PubSCl3DRCallDiverted:
Ruf wurde umgeleitet
PubSCl3DRCallRoutingFailed:
Call Routing Fehler (Fehler im Skript des Angerufenen)
PubSCl3DRPermissionDenied:
Keine Berechtigung für diesen Ruf
PubSCl3DRNetworkCongestion:
Öffentliches Telefonnetz überlastet
PubSCl3DRNoChannelAvailable:
Kein Gateway-Kanal verfügbar
PubSCl3DRNumberChanged:
Die Rufnummer hat sich geändert
PubSCl3DRIncompatibleDestination:
Inkompatible Gegenstelle (Sprach-Kompression)

 

Weitere Funktionen und Eigenschaften sind in der Datei CLMgrPub.idl dokumentiert.

Empfangen von Line Manager Events unter Visual C++: Events können sowohl als COM-Events als auch als Window Messages empfangen werden. Das Beispiel "Visual C++ Simple" zeigt beide Varianten. Die Build Targets "Win32 Debug Using Event Sink" und "Win32 Release Using Event Sink" definieren das Define USE_EVENT_SINK und zeigen das Verwenden von Connection Points und COM-Events. Alternativ wird das Hauptfenster als Empfänger für Window Messages registriert.

Die Window Messages werden in der Funktion CMfcClientDlg::OnClientLineManagerEvent(WPARAM wParam, LPARAM lParam) verarbeitet, die COM-Events schlagen in der Funktion CCLMgrEventSink::DispOnLineMgrNotification(long msg, long param) ein. Die Klasse CCLMgrEventSink können Sie leicht modifiziert in eigenen Applikationen weiterverwenden.

Beispiel "Visual C++ Call Log"

Das Beispiel "Visual C++ Call Log" zeigt einen MFC-Client, der Anrufe protokolliert. Dieser Client läuft generell neben SwyxIt! und meldet sich daher auch nicht an oder ab. Auch hier gibt es zwei Build Targets "Win32 Debug Using Event Sink" und "Win32 Release Using Event Sink" die das Verwenden von Connection Points und COM-Events zeigen. Die Klasse CCLMgrEventSink können Sie leicht modifiziert in eigenen Applikationen weiterverwenden.

Beispiel "Visual C++ ATL PlugIn"

Das Beispiel "Visual C++ ATL PlugIn" zeigt einen ATL-basierten Client. Es wird ein Client Line Manager PlugIn implementiert, welches eine Namensauflösung für SwyxIt! implementiert. Bei Rufen mit unbekanntem Namen fragt der Client Line Manager alle installierten PlugIns nach einer passenden Namensauflösung. Hiermit könnten Sie also eine Namensauflösung auf Basis einer eigenen Datenbank implementieren. Auch dieser Client meldet sich nicht am SwyxServer an.

Für eine eigene Anpassung sollten Sie die GUIDs und die Klassen-Namen PlugInSample.MyResolver etc. in den Dateien PlugInSample.idl und MyResolver.rgs durch eigene GUIDs und Namen ersetzen, um Konflikte mit anderen auf dem Client SDK basierenden Applikationen zu vermeiden. Ändern Sie aber auf gar keinen Fall die GUIDs aus CLMgrPub.idl bzw. CLMgrPubTypes.c!

In der Datei PlugInSample.cpp sind die Funktionen zum Registrieren und Deregistrieren des PlugIns implementiert. Damit der Client Line Manager das PlugIn läd, schreibt das PlugIn seine Class ID in die Line Manager Registry HKLM\SOFTWARE\Swyx\Client Line Manager\CurrentVersion\Options\PlugIns\{GUID}

Das eigentliche PlugIn Objekt CMyResolver ist in den Dateien MyResolver.cpp und MyResolver.h definiert und deklariert. Das PlugIn Objekt implementiert die Interfaces IClientAddInLoader, IClientResolverAddIn und IClientLineMgrEventsDisp. Das Interface IClientAddInLoader wird vom Line Manager zum Laden und Freigeben des PlugIns verwendet, das Interface IClientResolverAddIn dient der Namensauflösung. Das Interface IClientLineMgrEventsDisp schließlich empfängt Line Manager events.

Wenn das PlugIn vom Line Manager geladen wird, ruft der Line Manager die Funktionen IClientAddInLoader::Initialize, IClientAddInLoader::GetName und IClientAddInLoader::GetVersion auf. Bevor der Line Manager das Interface IClientAddInLoader wieder freigibt und das PlugIn entladen wird, ruft er die Methode IClientAddInLoader::UnInitialize auf. Das PlugIn hat dann die Möglichkeit, eigene Aufräumarbeiten durchzuführen.

Im Beispiel registriert das PlugIn in der Implementierung CMyResolver::Initialize eine event sink zum Line Manager, damit es events empfängt. Der Line Manager Interface Pointer pIClientLineMgrPub wird in der globalen Interface Table gespeichert. Mit dem entsprechenden cookie m_dwCLMgrCookie wird der Pointer dann jeweils bei Bedarf aus der globalen Interface Table geholt und dabei automatisch in den aktuellen Thread Kontext gemarshalled (grausames Wort). Die Hilfsfunktionen hierfür finden Sie in den Dateien githelp.cpp und githelp.h. Dieser Aufwand ist erforderlich, sobald ein COM-Interface-Pointer aus unterschiedlichen Threads heraus verwendet werden soll. GetName und GetVersion sind unspektakulär. In der Implementierung von CMyResolver::UnInitialize wird die event sink wieder freigegeben, so etwas ist immer eine gute Idee.

Line Manager events schlagen in der Funktion CMyResolver::DispOnLineMgrNotification ein. Ihr PlugIn könnte dann zum Beispiel Journal-Einträge in eine Datenbank schreiben, oder eine Datenbank zum Anzeigen von Kontaktinformationen animieren.

In CMyResolver::GetPreferredNumberStyle kann das PlugIn sich wünschen, in welchem Format es die Rufnummern für die Namensauflösung gerne haben möchte. In der Regel empfiehlt sich das Format PubCLMgrNumberStyleFull (z.B. 0004923147770 oder 0023147770). Für jede aufzulösende Rufnummer wird dann vom Client Line Manager die Funktion CMyResolver::ResolveNumber aufgerufen. Dort hat dann Ihr PlugIn die Chance, dem SwyxIt! einen Namen für diese Rufnummer unterzujubeln.

SwyxIt! ersetzen

Möchten Sie unverständlicher Weise auf SwyxIt!.exe vollständig verzichten (aber wer will das schon), so muss Ihre eigene Anwendung ein vollständiges Call Control ermöglichen. Der Anwender hat sonst keine Chance, einen Zweitanruf anzunehmen oder einen Ruf auf Halten zu legen. In der Regel ist es zu bevorzugen, über die eigene Anwendung lediglich zu wählen bzw. Anrufe zu monitoren.

Das Verhalten des Client Line Managers gegenüber anderen Call Control Applikationen kann in der Registry konfiguriert werden:

HKEY_LOCAL_MACHINE\SOFTWARE\SWYX\Client Line Manager\CurrentVersion\Options DWORD "LaunchCallControlApplication" aktiviert (1, default) oder deaktiviert (0) das Starten einer Call Control Application im Falle eines Hook Off. Soll also keine Appliation automatisch beim Hook Off gestartet werden, so ist dieser Wert auf 0 zu setzen.

 

DWORD "AlternateCallControl" aktiviert (1) oder deaktiviert (0, default) das Starten einer alternativen Call Control Application. Soll also nicht SwyxIt! sondern Ihre Applikation gestartet werden, so muss dieser Wert auf 1 gesetzt werden.

 

String "AlternateCallControlApplication" gibt den Pfad zu der alternativen Call Control Application an. Wird verwendet, wenn Sie AlternateCallControl auf 1 setzen. Dieser Pfad kann auch Command Line Options enthalten.

 

Möchten Sie verhindern, dass Ihre alternative Applikation mehrfach aufgerufen wird, so müssen Sie in dieser Applikation eine named Semaphore mit dem Namen ALTERNATEPHONECLIENTRUNNING öffnen. Der Client Line Manger wird Ihre Applikation nur starten, wenn diese Semaphore noch nicht vorhanden ist:

//use semaphore for checking running instance
HANDLE hSemaphore=OpenSemaphore(SYNCHRONIZE, FALSE, "ALTERNATEPHONECLIENTRUNNING");
if(hSemaphore)
{
 CloseHandle(hSemaphore);
}
else
{
 //no running instance, launch call control application
 WinExec(m_pLineMgr->m_sFullCallControlClientPath.c_str(), SW_SHOW);
}


Referenzen

Soweit die von uns gelieferte oder/und verwendete Software Open Source Elemente beinhaltet, gelten zusätzlich die unter https://www.swyx.de/open-source einsehbaren zusätzlichen Bedingungen. Welche Produkte aus dem Swyx Portfolio Open Source Elemente beinhalten und welche Open Source Lizenz einschlägig ist, ergibt sich aus der unter folgender URL einsehbaren Liste https://www.swyx.de/open-source.

Informationen anderer Anbieter, die in diesem Artikel zur Verfügung gestellt werden, sollen bei der Suche nach technischen Informationen helfen. Die Inhalte können ohne weitere Ankündigung geändert werden. Swyx garantiert weder für die Güte von Inhalten anderer Anbieter, noch ist Swyx für diese verantwortlich.


Kommentar

Hat Ihnen dieser Artikel weitergeholfen? Kommentieren Sie diesen Artikel



Sollten sich Fragen aus Ihrem Kommentar ergeben, wie können wir Sie erreichen?

E-Mail Adresse (optional)


Hinweis

Dieses Kommentar-Feld steht Ihnen nicht für Support-Anfragen zur Verfügung. Diese richten Sie bitte ausschliesslich an Ihren Swyx Händler bzw. Distributor.