Подключиться получается, и даже уведомления о звонках получаю, но через пол часа или час, уведомления перестают приходить. Перезапуск программы (как выяснилось позже) дает результат, но уведомления перестают приходить уже через минут 10 - 15.
Кто сталкивался с подобным, подскажите где собака зарыта? )
Вот код, который слушает события от АТС.
CODE
DWORD g_dwAPIVersion = 0x00020001;
DWORD g_dwExtVersion = 0;
unsigned __stdcall line_event_proc(void* p)
{
LINEMESSAGE lm;
LPLINECALLSTATUS lpCallStatus;
long lResult;
DWORD dwLCSSize;
TCHAR szBuff[4096];
int nBuffPos;
dwLCSSize = sizeof(LINECALLSTATUS) + 4096;
lpCallStatus = (LPLINECALLSTATUS)malloc(dwLCSSize);
SYSTEMTIME st;
while (true) {
lResult = lineGetMessage(g_hLineApp, &lm, INFINITE);
if (lResult != 0) {
if (lResult == LINEERR_INVALAPPHANDLE){
_tprintf(_T("Application shuting down, leaving thread\n"));
return 0;
}
_tprintf(_T("EventThreadFunc: error on lineGetMessage: %x\n"), lResult);
Sleep(100);
continue;
}
if (LINE_CALLSTATE == lm.dwMessageID) {
memset(lpCallStatus, 0, dwLCSSize);
lpCallStatus->dwTotalSize = dwLCSSize;
// line status
if (!lineGetCallStatus(lm.hDevice, lpCallStatus)) {
switch(lpCallStatus->dwCallState) { // здесь обрабатываю сообщения
}
}
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
LINEINITIALIZEEXPARAMS lip = {};
lip.dwTotalSize = sizeof(LINEINITIALIZEEXPARAMS);
lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
lResult = lineInitializeEx(&g_hLineApp, GetModuleHandle(NULL), NULL, _T("TAPI call monitor"),
&dwNumDevs, &g_dwAPIVersion, &lip);
g_hTAPIEvent = lip.Handles.hEvent;
hThread = (HANDLE)_beginthreadex(NULL, 0, &line_event_proc, NULL, 0, &nThreadID);
for (DWORD dwDeviceID = 0; dwDeviceID < dwNumDevs; dwDeviceID++) {
HLINE hLine;
LINEEXTENSIONID lineExtensionID = {};
lResult = lineNegotiateAPIVersion(g_hLineApp, dwDeviceID, dwAPILowVersion, dwAPIHighVersion,
&g_dwAPIVersion, &lineExtensionID);
lResult = lineOpen (g_hLineApp, dwDeviceID, &hLine, g_dwAPIVersion, g_dwExtVersion, NULL,
LINECALLPRIVILEGE_MONITOR, 0, NULL);
}
getchar();
Sleep(100);
}
DWORD g_dwExtVersion = 0;
unsigned __stdcall line_event_proc(void* p)
{
LINEMESSAGE lm;
LPLINECALLSTATUS lpCallStatus;
long lResult;
DWORD dwLCSSize;
TCHAR szBuff[4096];
int nBuffPos;
dwLCSSize = sizeof(LINECALLSTATUS) + 4096;
lpCallStatus = (LPLINECALLSTATUS)malloc(dwLCSSize);
SYSTEMTIME st;
while (true) {
lResult = lineGetMessage(g_hLineApp, &lm, INFINITE);
if (lResult != 0) {
if (lResult == LINEERR_INVALAPPHANDLE){
_tprintf(_T("Application shuting down, leaving thread\n"));
return 0;
}
_tprintf(_T("EventThreadFunc: error on lineGetMessage: %x\n"), lResult);
Sleep(100);
continue;
}
if (LINE_CALLSTATE == lm.dwMessageID) {
memset(lpCallStatus, 0, dwLCSSize);
lpCallStatus->dwTotalSize = dwLCSSize;
// line status
if (!lineGetCallStatus(lm.hDevice, lpCallStatus)) {
switch(lpCallStatus->dwCallState) { // здесь обрабатываю сообщения
}
}
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
LINEINITIALIZEEXPARAMS lip = {};
lip.dwTotalSize = sizeof(LINEINITIALIZEEXPARAMS);
lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
lResult = lineInitializeEx(&g_hLineApp, GetModuleHandle(NULL), NULL, _T("TAPI call monitor"),
&dwNumDevs, &g_dwAPIVersion, &lip);
g_hTAPIEvent = lip.Handles.hEvent;
hThread = (HANDLE)_beginthreadex(NULL, 0, &line_event_proc, NULL, 0, &nThreadID);
for (DWORD dwDeviceID = 0; dwDeviceID < dwNumDevs; dwDeviceID++) {
HLINE hLine;
LINEEXTENSIONID lineExtensionID = {};
lResult = lineNegotiateAPIVersion(g_hLineApp, dwDeviceID, dwAPILowVersion, dwAPIHighVersion,
&g_dwAPIVersion, &lineExtensionID);
lResult = lineOpen (g_hLineApp, dwDeviceID, &hLine, g_dwAPIVersion, g_dwExtVersion, NULL,
LINECALLPRIVILEGE_MONITOR, 0, NULL);
}
getchar();
Sleep(100);
}