SwyxIt! bietet zwei Schnittstellen für die Steuerung von Anrufen:
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.
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. Diese Dokumentation stellt die grundlegenden Zusammenhänge dar. Bitte verwenden Sie die idl-Datei als Referenz.
Verzeichnis PublicInterface:
Verzeichnis Samples:
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
Long
Rückgabewert 0: kein Fehler. Andernfalls ist der Wert ein
HRESULT Fehlercode.
Anmeldung:
DispRegisterUser(UserName As String) As
Long
Rü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 ClientLine
DispSelectLine(pIClientLine As ClientLine)
As Long
Wählen einer Nummer auf einer beliebigen
Leitung
DispSimpleDialEx(dialstring As String) As Long
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:
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 |
13: | Ruf wird übergeben. |
14: | Gesperrt. Nachbeartungszeit. Kommende Rufe werden auf dieser Leitung nicht signalisiert. |
15: | Direktruf. Kommender Intercom Ruf, Verbindung ist aufgebaut, Mikrofon ist stummgeschaltet. |
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 pIClientLine
HRESULT PubSelectLine([in]
IClientLinePub* pIClientLine);
Wählen einer Nummer auf einer beliebigen Leitung
HRESULT
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);
Grund für Besetzt / Ruf beendet:
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++ PlayToRtp"
Das Beispiel "Visual C++ PlayToRtp" zeigt einen MFC-Client, der Wave-Dateien in den Sprachdatenstrom einspielt bzw. einen Sprachdatenstrom aufzeichnet.
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.
Visual C++ WakeUp
Dieses Beispiel zeigt die Verwendung eines SwyxIt! zum Aufbauen von Weckrufen. Per Registry-Key kann ein PowerDial Modus aktiviert werden:
Aktivieren Sie den Power Dial Modus mit dem reg file "PowerDialerMode.reg". Das reg-file setzt auch den key "CancelBlindTransferOnVoicemail" auf 0, damit ein Blind Call Transfer (forward) auf eine Voicemail-Ansage möglich ist. Im SwyxIt! sollten Sie dann noch in den Benutzereinstellungen das Aufpoppen während einer Verbindung abschalten, sonst ist es etwas nervig.
Das beiliegende Beispiel kann auf allen zur Verfügung stehenden Leitungen gleichzeitig wählen. Die jobs werden aus der Datei JobsToDo.txt gelesen. Jede Zeile entspricht einem auszuführenden Call und enthält drei Strings per Semikolon getrennt. Der erste String ist die zu wählende Rufnummer. Bei einem Connect wird der Call zu der Rufnummer im zweiten String transferiert. Der dritte String ist ein Counter für die Anzahl der erfolgten Versuche. Wenn Sie in der Testapplikation auf Start klicken, wird nach einem timeout die Anwahl der Rufnummern gestartet. Durch klicken auf Stop wird der Lauf abgebrochen und in eine zweite Datei werden alle erfolgreichen Jobs geschrieben. Die Datei JobsToDo.txt enthält dann die noch nicht erfolgreichen Calls, mit Anzahl der Versuche.
Visual Studio.Net C# Simple
Dieses Minimal-Beispiel zeigt, wie man das Client SDK COM API von einer .Net Anwendung aufruft. Es ist eine einfache Windows-Form Applikation in C#, geschrieben mit dem Visual Studio.Net 2003. Um das Client SDK COM API zu benutzen, fügen Sie die "CLMGR 2.0 Type Library" als Referenz zu Ihrem Projekt hinzu. Visual Studio.NET erzeugt dabei automatisch einen Runtime-Callable-Wrapper, der die Funktionen des COM APIs CLMGRLib verfügbar macht.
Visual Studio.Net C# IpPbxMPC
Dieses Beispiel ist eine vollständige C# Applikation namens IpPbx Media Player Controller. Sie dient dazu, einen auf dem PC laufenden Media Player, wie Winamp oder den Windows Media Player fernzusteuern, d.h. das Abspielen von Musik zu unterbrechen, sobald man mit SwyxIt! telefoniert und die Musik weiterlaufen zu lassen, wenn das Gespräch beendet ist. Dazu empfängt IpPbxMPC über das Client SDK COM API Events des Client Line Managers über den Leitungszustand der SwyxIt! Leitungen. Sobald nicht mehr alle Leitungen inaktiv sind, wird dem konfigurierten MediaPlayer ein "Pause" Befehl gesendet. Sind wieder alle Leitungen inaktiv, wird über einen "Play" Befehl der Media Player wieder gestartet. Alternativ kann man den Aktiv-Zustand einer oder mehrerer beliebiger Namenstasten benutzen. Verwendet man ein SwyxIt! v4.20 im CTI-Modus, funktioniert das auch mit dem per CTI ferngesteuerten SwyxPhone, da dessen Leitungszustände auch am CTI-SwyxIt! angezeigt werden.
Events in einer C# Applikation empfangen
Die ClientLineMgrClass des Client SDK COM APIs unterstützt den delegate/event Mechanismus des .NET Frameworks. Die Funktion ConnectAndLogin() in Form1.cs zeigt, wie man diesen Mechanismus benutzt, um LineManager Events zu empfangen:
clmgr = new ClientLineMgrClass();
clmgr.DispOnLineMgrNotification +=
Hiermit wird jedemal die Funktion
new CLMGRLib.IClientLineMgrEventsDisp_DispOnLineMgrNotificationEventHandler(this.OnLineMgrNotification);
public void OnLineMgrNotification(System.Int32 msg, System.Int32 param)
aufgerufen, wenn der SwyxIt! LineManager ein LineManagerEvent sendet.
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);
}