ITBasicCallControl - Problem
-
Hallo,
ich erzeuge folgendes:
ITBasicCallControl *pCall;
Bei eintreffenden Anruf erzeuge ich ein neues Call-Objekt:
m_pCall = new CtCall(pLine, hCall, this);
Wie kann ich über pCall auf m_pCall zugreifen und z.B. Anruf unterbrechen?
pCall->Disconnect(DC_REJECTED);
-
Wieso legst Du nicht ein ITAddress-Objekt an und erstellst über CreateCall ein ITBasicCallControl-Objekt?
-
ich bin absoluter Anfänger, was ist ein ITAddress-Objekt und wie kann ich über CreateCall ein ITBasicCallControl-Objekt erstellen?
Ein kleines Code-Beispiel währe sehr hilfreich.
Vielen Dank.
-
// Initialize COM CoInitializeEx( NULL, COINIT_MULTITHREADED); // Create a TAPI entry point object. ITTAPI *gpTapi; CoCreateInstance( CLSID_TAPI, NULL, CLSCTX_INPROC_SERVER, IID_ITTAPI, (LPVOID*)&gpTapi); // Initialize TAPI gpTapi->Initialize(); // collect phone devices IEnumAddresses *pEnum; gpApi->EnumerateAddresses( &pEnum); ITAddress* pAddress = ...; // durch pEnum iterieren, um richtiges Phone-Device zu finden pEnum->Release(); ITBasicCallControl *pCall; pAddress->CreateCall( ...&pCall); // Deine Anrufparameter // Aufräumarbeiten pCall->Release(); pAddress->Release(); // ...
Hab ich mal schnell aus der MSDN zusammengeklaut ...
-
Als erstens vielen Dank für deine Hilfe RenéG.
Ich kann leider mit dem Code-Beispiel nichts anfangen.
Ich bin jetzt soweit dass ich ankommenden Anruf erkenne.
Beim Eintritt eines neuen Anrufes wird CtCall-Objekt erzeugt:m_pCall = new CtCall(pLine, hCall, this);
Ich kann mit dem folgendem Code den Anruf annehmen:
m_pCall->Accept(); //Anruf akzeptieren
m_pCall->Answer(); //Anruf annehmenMeine Frage:
Was muss ich machen damit ich den Anruf ablehne?
Mit m_pCall->Drop()lege ich den Anruf auf und der Anrufer bekommt "Anruf Aufgelegt"-Zeichen, ich möchte aber dass er "besetzt"-Zeichen bekommt.Ich habe gedacht dass es mit ITBasicCallControl-Objekt möglich ist, den ankommenden Anruf zu steuern bzw. abzulehnen.
ITBasicCallControl *pCall;
pCAll->Disconnect(DC_REJECTED);Mit den Vorgeschlagenen Code kann ich wirklich nichts anfangen.
Ich hoffe du verstehst mein Problem jetzt besser.Wie könnte ich mein Problem lösen?
-
Da CtCall ein mir unbekanntes Objekt ist, kann ich Dir nur vorschlagen, dieses zu durchsuchen nach einer Funktion, mit der Du ein ITBasicCallControl bekommst!
-
Meine CtCall-Klasse sieht wie folgt aus:
--------------------------------------------------------------------------------
class CtCall : public CtReplyTarget
{
public:
// Operations
CtCall(CtLine* pLine);
CtCall(CtLine* pLine, HCALL hCall, CtCallSink* pInitialSink = 0);
virtual ~CtCall();CtLine* GetLine() const;
HCALL GetHandle() const;
HCALL Attach(HCALL hCall, CtCallSink* pInitialSink = 0);
HCALL Detach();// Can have multiple sinks per object and they stay around for the
// life of the object (which may be different than the life of the handle).
void AddSink(CtCallSink* pSink);
void RemoveSink(CtCallSink* pSink);BOOL IsRequestPending(TREQUEST nRequestID = 0,
DWORD* pnRequestType = 0) const;
BOOL IsRequestTypePending(DWORD nRequestType) const;static CtCall* FromHandle(HCALL hCall);
// TAPI wrappers
tfxasync TRESULT Accept(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
tfxasync TRESULT Answer(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
tfxasync TRESULT Dial(LPCSTR szDestAddress, DWORD dwCountryCode = 0);
tfxasync TRESULT Drop(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
tfxasync TRESULT GenerateDigits(LPCSTR szDigits, DWORD nDuration = 0,
DWORD nDigitMode = LINEDIGITMODE_DTMF);TRESULT GenerateTone(DWORD nToneMode, DWORD nDuration,
DWORD nCustomTones = 0, LINEGENERATETONE* pCustomTones = 0);
TRESULT Deallocate();TRESULT GatherDigits(LPSTR pszDigits, DWORD nDigits,
LPCSTR pszTerminationDigits = 0,
DWORD nFirstDigitTimeout = 5000,
DWORD nInterDigitTimeout = 5000,
DWORD nDigitModes = LINEDIGITMODE_DTMF);TRESULT Handoff(LPCSTR szFileName);
TRESULT Handoff(DWORD nMediaMode);tfxasync TRESULT MakeCall(LPCSTR szDestAddress = 0, DWORD nCountryCode = 0,
CtCallSink* pInitialSink = 0, LINECALLPARAMS* pCallParams = 0);TRESULT MonitorDigits(DWORD dwDigitModes = LINEDIGITMODE_DTMF);
// Call Events
void OnInfo(DWORD nCallInfo);
void OnState(DWORD nCallState, DWORD dwParam2, DWORD nCallPriviledge);
void OnGatherDigits(DWORD nGatherTerm);
void OnGenerate(DWORD nGenerateTerm);
void OnMonitorDigits(char cDigit, DWORD nDigitMode);
void OnMonitorMedia(DWORD nMediaMode);
void OnMonitorTone(DWORD dwAppSpecific);// CtReplyTarget event
void OnReply(TREQUEST nRequestID, TRESULT nResult, DWORD nRequestType);protected:
static void AddToCalls(CtCall* pCall);
static void RemoveFromCalls(CtCall* pCall);private:
static CPtrList s_listCalls;HCALL m_hCall;
CtLine* m_pLine;// Use an array instead of a list to allow
// removing sinks during event handling
CPtrArray m_rgSinks;
};--------------------------------------------------------------------------------
Ich hoffe du kannst mir jetzt vielleicht helfen wie ich mit Hilfe von ITBasicCallControl ankommenden Anruf ablehnen kann.