Это кусок библы, инициализирующей и мониторящей TAPI (будь оно проклято!!). Трейсер, сделанный на ее основе прекрасно работает, а весь мой код на vb6 - нет
Конечно, на вб у меня из-за потоков не полный аналог, но принцип тот же. Но не работает. Помогите перетащить этот код под vb.net. Мне здесь не понятен механизм создания потока и откуда в строчке
m_hTapiEvent_L = lip.Handles.hEvent; взялось Handles???
- Код: Выделить всё
LONG CTapiConnection::InitLines(LPCTSTR pszAppName, DWORD dwAPIVersion)
{
LONG lResult = -1;
// Initialize the line portion of TAPI..
LINEINITIALIZEEXPARAMS lip;
ZeroMemory (&lip, sizeof(LINEINITIALIZEEXPARAMS));
while (lResult != 0)
{
lip.dwTotalSize = sizeof(LINEINITIALIZEEXPARAMS);
lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
lResult = lineInitializeEx (&m_hLineApp, AfxGetInstanceHandle(),
NULL, pszAppName, &m_dwNumLines, &dwAPIVersion, &lip);
if (lResult != LINEERR_REINIT)
break;
}
// If we were unsuccessful then return an error
if (lResult != 0)
return lResult;
// Otherwise, open the line
m_hTapiEvent_L = lip.Handles.hEvent;
if (m_hTapiEvent_L == NULL)
return LINEERR_NOMEM;
// Create the thread which will monitor TAPI events.
m_pMonitorThread_L = AfxBeginThread((AFX_THREADPROC) _LineEventProc, (void*)this);
if (m_pMonitorThread_L == NULL)
{
TRACE(_T("Failed to create monitor thread\r\n"));
lineShutdown(m_hLineApp);
m_hLineApp = NULL;
return LINEERR_OPERATIONFAILED;
}
return lResult;
}
UINT _LineEventProc ( LPVOID pParam )
{
CTapiConnection* pConn = (CTapiConnection*) pParam;
pConn->LineEventProc();
return 0;
}
void CTapiConnection::LineEventProc()
{
LINEMESSAGE lm;
LONG lResult;
// Spin forever waiting on TAPI to shutdown
do
{
// Get the TAPI message
lResult = lineGetMessage(m_hLineApp, &lm, 5000);
if (lResult == 0)
{
// If this is an asynch request completing, then mark it in our list
// and then pass it down to the line.
if (lm.dwMessageID == LINE_REPLY)
OnRequestComplete (lm.dwParam1, lm.dwParam2);
// If this is a LINE_CREATE message, then a new line has been dynamically
// added to TAPI (Plug&Play). Manage it.
else if (lm.dwMessageID == LINE_CREATE)
OnLineCreate (lm.dwParam1);
// If this is a LINE_REMOVE message, then a line has been removed from the system.
else if (lm.dwMessageID == LINE_REMOVE)
OnLineRemove (lm.dwParam1);
else if (lm.dwMessageID == LINE_CLOSE)
OnLineClose (lm.dwParam1);
else // Line or call message.
{
CTapiLine* pLine = (CTapiLine*) lm.dwCallbackInstance;
if (pLine != NULL)
pLine->LineCallback (lm.hDevice, lm.dwMessageID, lm.dwParam1, lm.dwParam2, lm.dwParam3);
}
}
// Kill any completed requests still in queue.
PurgeRequests(5000);
} while (lResult != LINEERR_INVALAPPHANDLE);
m_pMonitorThread_L = NULL;
}
Лучший способ понять что-то самому — объяснить это другому.