⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comdial.c

📁 可以实现最简单的电话呼叫和应答,并可以通过按键来实现接通和挂断
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include "comdial.h"
#include "resource.h"

extern MYTAPI mytapi;
extern HWND ghWnd;
extern HINSTANCE ghInst;
extern DWORD WINAPI ReadThread(LPVOID lpParams);


//000****************************************************************
LONG telephonyInitialize(HWND hWnd,HINSTANCE ghInst)
{
	LONG lrc;
	UINT i;
	LINEEXTENSIONID extensions;

	while ((lrc=lineInitialize(&mytapi.hTAPI,ghInst,
					mytapi.CallbackProc=
						(LINECALLBACK)LineCallbackProc,
					NULL,&mytapi.dwNumLines))
		   ==LINEERR_REINIT) 
	{
		Sleep(5);
		if (MessageBox(hWnd,
				"Telephony system is reinitializing-Click Cancel to abort",
				"Error",MB_RETRYCANCEL)
			==IDCANCEL) goto done;
	}

	if (lrc) goto done;
	mytapi.bInitialized=1;

	for (i=0;i<mytapi.dwNumLines;i++) {
		lrc=lineNegotiateAPIVersion(mytapi.hTAPI,i,
				0x00010000,TAPI_CURRENT_VERSION,
				&mytapi.dwVersionToUse,&extensions);
		if (lrc) continue;
		lrc=mylineGetDevCaps();
		if (lrc) goto done;
		if (mytapi.pLineDevCaps->dwMediaModes 
				& LINEMEDIAMODE_DATAMODEM)
		{
			mytapi.dwLine=i;
			break;
		}
	}
	if (lrc) goto done;
	lrc=mylineGetOldDevConfig();
	if (lrc) goto done;
	lrc=mylineGetDevConfig();
	if (lrc) goto done;

	mytapi.hAsyncFuncEnded=
		CreateEvent(NULL,TRUE,FALSE,NULL);

	return lrc;

done:
	ProcessTAPIError(lrc);
	telephonyShutdown();
	return lrc;
}

//001*****************************************************************
LONG telephonyOpen(HWND hWnd,HINSTANCE ghInst)
{
	LONG lrc;
	lrc=lineOpen(mytapi.hTAPI,mytapi.dwLine,&mytapi.hLine,
			mytapi.dwVersionToUse,0,0,LINECALLPRIVILEGE_OWNER,
			LINEMEDIAMODE_DATAMODEM,NULL);
	if (lrc) goto done;
	mytapi.bLineOpen=TRUE;

	myDrawTAPIIcon(hWnd);

	lrc=telephonyCaps();
	if (lrc) goto done;

	lrc=lineSetStatusMessages(mytapi.hLine,
			mytapi.pLineDevCaps->dwLineStates,
			mytapi.pLineAddressCaps->dwAddressStates);
	if (lrc) goto done;

	lrc=telephonyGetModemCaps();
	if (lrc) goto done;
	lrc=telephonyGetModemSettings();
	if (lrc) goto done;

	return lrc;

done:
	ProcessTAPIError(lrc);
	telephonyShutdown();
	return lrc;
}

//002****************************************************************
LONG telephonyGetModemCaps()
{
	DWORD dwsize=sizeof(COMMPROP)+sizeof(MODEMDEVCAPS);
	LONG lrc;

	if (mytapi.bCommPropAlloced) {
		free(mytapi.pCommProp);
		mytapi.bCommPropAlloced=FALSE;
	}

	if (!(mytapi.pCommProp=(COMMPROP *)calloc(1,dwsize)))
		return LINEERR_NOMEM;
	mytapi.bCommPropAlloced=TRUE;
	mytapi.pCommProp->wPacketLength=(WORD)dwsize;
	mytapi.pCommProp->dwProvSpec1=COMMPROP_INITIALIZED;

	lrc=mylineGetID();
	if (lrc) {
		free(mytapi.pCommProp);
		mytapi.bCommPropAlloced=FALSE;
		return lrc;
	}

	lrc=GetCommProperties(mytapi.hComm,mytapi.pCommProp);
	CloseHandle(mytapi.hComm);
	mytapi.bGotCommHandle=FALSE;
	if (!lrc) {
		free(mytapi.pCommProp);
		mytapi.bCommPropAlloced=FALSE;
		myMessageBox("Error GetCommProperties");
		return -1;
    }

	mytapi.pModemCaps=(MODEMDEVCAPS *)mytapi.pCommProp->wcProvChar;
	dwsize=mytapi.pModemCaps->dwRequiredSize+sizeof(COMMPROP);
	free(mytapi.pCommProp);
	if (!(mytapi.pCommProp=(COMMPROP *)calloc(1,dwsize)))
		return LINEERR_NOMEM;
	mytapi.bCommPropAlloced=TRUE;
	mytapi.pCommProp->wPacketLength=(WORD)dwsize;
	mytapi.pCommProp->dwProvSpec1=COMMPROP_INITIALIZED;

	lrc=mylineGetID();
	if (lrc) {
		free(mytapi.pCommProp);
		mytapi.bCommPropAlloced=FALSE;
		return lrc;
    }

	lrc=GetCommProperties(mytapi.hComm,mytapi.pCommProp);
	CloseHandle(mytapi.hComm);
	mytapi.bGotCommHandle=FALSE;
	if (!lrc) {
		free(mytapi.pCommProp);
		mytapi.bCommPropAlloced=FALSE;
		myMessageBox("Error GetCommProperties");
		return -1;
    }

	mytapi.pModemCaps=(MODEMDEVCAPS *)mytapi.pCommProp->wcProvChar;
	return 0;
}

//003****************************************************************************
LONG telephonyGetModemSettings()
{
	DWORD dwsize=sizeof(COMMCONFIG)+sizeof(MODEMSETTINGS);
	LONG lrc;

	for (;;) {
		if (mytapi.bCommConfigAlloced) {
			free(mytapi.pCommConfig);
			mytapi.bCommConfigAlloced=FALSE;
		}
		if (!(mytapi.pCommConfig=(COMMCONFIG *)calloc(1,dwsize)))
			return LINEERR_NOMEM;
		mytapi.bCommConfigAlloced=TRUE;
		mytapi.pCommConfig->dwSize=dwsize;

		lrc=mylineGetID();//require  for  MODDEM handle 
		if (lrc) {
			free(mytapi.pCommConfig);
			mytapi.bCommConfigAlloced=FALSE;
			return lrc;
		}

		lrc=GetCommConfig(mytapi.hComm,mytapi.pCommConfig,&dwsize);
		CloseHandle(mytapi.hComm);
		mytapi.bGotCommHandle=FALSE;
		if (!lrc) {
			free(mytapi.pCommConfig);
			mytapi.bCommConfigAlloced=FALSE;
			myMessageBox("Error GetCommConfig");
			return -1;
		}

		mytapi.pModemSettings=
			(MODEMSETTINGS *)mytapi.pCommConfig->wcProviderData;
		if (mytapi.pCommConfig->dwSize<dwsize) continue;

		break;
	} 

	return 0;
}

//004**************************************************************************************
void myDrawTAPIIcon(HWND hwnd)
{
	HICON hIcon;
	lineGetIcon(mytapi.dwLine,NULL,&hIcon);
	SetClassLong(hwnd,GCL_HICON,(LONG)hIcon);
}

//005**************************************************************************************
LONG mylineGetDevConfig()
{
	LONG lrc;
	DWORD dwSize;

	if (mytapi.bDevConfigAlloced) {
		free(mytapi.pDevConfig);
		mytapi.bDevConfigAlloced=FALSE;
	}
	if (!(mytapi.pDevConfig=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
		return LINEERR_NOMEM;
	mytapi.bDevConfigAlloced=TRUE;

	mytapi.pDevConfig->dwTotalSize=sizeof(VARSTRING);
	for (;;) {
		lrc=lineGetDevConfig(mytapi.dwLine,mytapi.pDevConfig,"comm/datamodem");
		if (lrc) {
			free(mytapi.pDevConfig);
			mytapi.bDevConfigAlloced=FALSE;
			return lrc;
		}
		if (mytapi.pDevConfig->dwTotalSize
				< mytapi.pDevConfig->dwNeededSize)
		{
			dwSize=mytapi.pDevConfig->dwNeededSize;
			free(mytapi.pDevConfig);
			mytapi.bDevConfigAlloced=FALSE;
			mytapi.pDevConfig=(VARSTRING *)calloc(1,dwSize);
			if (!mytapi.pDevConfig) return LINEERR_NOMEM;
			mytapi.bDevConfigAlloced=TRUE;
			mytapi.pDevConfig->dwTotalSize=dwSize;
			continue;
		}
		break;
	} 

	return lrc;
}

//006*********************************************************************************
LONG mylineGetOldDevConfig()
{
	LONG lrc;
	DWORD dwSize;

	if (mytapi.bOldDevConfigAlloced) {
		free(mytapi.pOldDevConfig);
		mytapi.bOldDevConfigAlloced=FALSE;
	}
	if (!(mytapi.pOldDevConfig=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
		return LINEERR_NOMEM;
	mytapi.bOldDevConfigAlloced=TRUE;

	mytapi.pOldDevConfig->dwTotalSize=sizeof(VARSTRING);

	for (;;) {
		lrc=lineGetDevConfig(mytapi.dwLine,mytapi.pOldDevConfig,"comm/datamodem");
		if (lrc) {
			free(mytapi.pOldDevConfig);
			mytapi.bOldDevConfigAlloced=FALSE;
			return lrc;
		}
		if (mytapi.pOldDevConfig->dwTotalSize
				< mytapi.pOldDevConfig->dwNeededSize)
		{
			dwSize=mytapi.pOldDevConfig->dwNeededSize;
			free(mytapi.pOldDevConfig);
			mytapi.bOldDevConfigAlloced=FALSE;
			mytapi.pOldDevConfig=(VARSTRING *)calloc(1,dwSize);
			if (!mytapi.pOldDevConfig) return LINEERR_NOMEM;
			mytapi.bOldDevConfigAlloced=TRUE;
			mytapi.pOldDevConfig->dwTotalSize=dwSize;
			continue;
		}
		break;
	} 

	return lrc;
}

//007***************************************************************************************
LONG mylineGetID()
{
	VARSTRING *vs;
	CommID *cid;
	LONG lrc;
	DWORD dwSize;

	mytapi.bGotCommHandle=FALSE;

	if (!(vs=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
		return LINEERR_NOMEM;
	vs->dwTotalSize=sizeof(VARSTRING);

	for (;;) {
		lrc=lineGetID(mytapi.hLine,0L,NULL,
			LINECALLSELECT_LINE,vs,"comm/datamodem");
		if (lrc) { free(vs); return lrc; }

		if (vs->dwTotalSize<vs->dwNeededSize) {
			dwSize=vs->dwNeededSize;
			free(vs);
			if (!(vs=(VARSTRING *)calloc(1,dwSize)))
				return LINEERR_NOMEM;
			vs->dwTotalSize=dwSize;
			continue;
		}
		break;
	} 
	cid=(CommID *)((LPSTR)vs+vs->dwStringOffset);

	if (mytapi.bModemNameAlloced) { 
		free(mytapi.szModemName);
		mytapi.bModemNameAlloced=FALSE;
	}
	if (!(mytapi.szModemName=(LPSTR)calloc(1,vs->dwStringSize)))
		return LINEERR_NOMEM;
	mytapi.bModemNameAlloced=TRUE;

	lstrcpy(mytapi.szModemName,cid->szDeviceName);
	mytapi.hComm=cid->hComm;
	free(vs);

	mytapi.bGotCommHandle=TRUE;

	return lrc;
}

//008**********************************************************************
LONG mylineGetCallID()
{
	CommID *cid;
	VARSTRING *vs;
	LONG lrc;
	DWORD dwSize;

	mytapi.bGotCommHandle=FALSE;

	if (!(vs=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
		return LINEERR_NOMEM;
	vs->dwTotalSize=sizeof(VARSTRING);

	for (;;) {
		lrc=lineGetID(NULL,0L,mytapi.hCall,
			LINECALLSELECT_CALL,vs,"comm/datamodem");
		if (lrc) { free(vs); return lrc; }

		if (vs->dwTotalSize<vs->dwNeededSize) {
			dwSize=vs->dwNeededSize;
			free(vs);
			if (!(vs=(VARSTRING *)calloc(1,dwSize)))
				return LINEERR_NOMEM;
			vs->dwTotalSize=dwSize;
			continue;
		}
		break;
	}
	cid=(CommID *)((LPSTR)vs+vs->dwStringOffset);

	if (mytapi.bModemNameAlloced) {
		free(mytapi.szModemName);
		mytapi.bModemNameAlloced=FALSE;
	}
	if (!(mytapi.szModemName=(LPSTR)calloc(1,vs->dwStringSize)))
		return LINEERR_NOMEM;
	mytapi.bModemNameAlloced=TRUE;

	lstrcpy(mytapi.szModemName,cid->szDeviceName);
	mytapi.hComm=cid->hComm;
	free(vs);

	mytapi.bGotCommHandle=TRUE;

	return lrc;
}

//009**********************************************************************
LONG mylineGetDevCaps()
{
	LONG lrc;
	DWORD dwsize;

	if (mytapi.bLineDevCapsAlloced) {
		free(mytapi.pLineDevCaps);
		mytapi.bLineDevCapsAlloced=FALSE;
	}
	if (!(mytapi.pLineDevCaps=(LINEDEVCAPS *)calloc(1,sizeof(LINEDEVCAPS))))
		return LINEERR_NOMEM;
	mytapi.bLineDevCapsAlloced=TRUE;

	mytapi.pLineDevCaps->dwTotalSize=sizeof(LINEDEVCAPS);
	for (;;) {
		lrc=lineGetDevCaps(mytapi.hTAPI,mytapi.dwLine,
			mytapi.dwVersionToUse,0,mytapi.pLineDevCaps);
		if (lrc) {
			free(mytapi.pLineDevCaps);
			mytapi.bLineDevCapsAlloced=FALSE;
			return lrc;
		}
		dwsize=mytapi.pLineDevCaps->dwNeededSize;
		if (mytapi.pLineDevCaps->dwTotalSize<dwsize)
		{
			free(mytapi.pLineDevCaps);
			mytapi.bLineDevCapsAlloced=FALSE;
			mytapi.pLineDevCaps=(LINEDEVCAPS *)calloc(1,dwsize);
			if (!mytapi.pLineDevCaps) return LINEERR_NOMEM;
			mytapi.bLineDevCapsAlloced=TRUE;
			mytapi.pLineDevCaps->dwTotalSize=dwsize;
			continue;
		}
		break;
	} 
	return lrc;
}

//010***************************************************************************************
LONG telephonyCaps()
{
	LONG lrc,i;
	DWORD dwsize;

	if (mytapi.bLineAddressCapsAlloced) {
		free(mytapi.pLineAddressCaps);
		mytapi.bLineAddressCapsAlloced=FALSE;
	}
	if (!(mytapi.pLineAddressCaps=(LINEADDRESSCAPS *)calloc(1,sizeof(LINEADDRESSCAPS))))
		return LINEERR_NOMEM;
	mytapi.bLineAddressCapsAlloced=TRUE;

	mytapi.pLineAddressCaps->dwTotalSize=sizeof(LINEADDRESSCAPS);
	i=0;
	do {
		lrc=lineGetAddressCaps(mytapi.hTAPI,mytapi.dwLine,i,
				mytapi.dwVersionToUse,0,mytapi.pLineAddressCaps);
		if (lrc) {
			free(mytapi.pLineAddressCaps);
			mytapi.bLineAddressCapsAlloced=FALSE;
			return lrc;
		}

		if (!(mytapi.pLineAddressCaps->
				dwCallFeatures & LINECALLFEATURE_ANSWER)) 
		{ i++; continue; }

		dwsize=mytapi.pLineAddressCaps->dwNeededSize;
		if (mytapi.pLineAddressCaps->dwTotalSize<dwsize)
		{
			free(mytapi.pLineAddressCaps);
			mytapi.bLineAddressCapsAlloced=FALSE;
			mytapi.pLineAddressCaps=(LINEADDRESSCAPS *)calloc(1,dwsize);
			if (!mytapi.pLineAddressCaps) return LINEERR_NOMEM;
			mytapi.bLineAddressCapsAlloced=TRUE;
			mytapi.pLineAddressCaps->dwTotalSize=dwsize;
			continue;
		}
		break;
	} while ((unsigned)i<mytapi.pLineDevCaps->dwNumAddresses);

	if ((unsigned)i==mytapi.pLineDevCaps->dwNumAddresses) {
		free(mytapi.pLineAddressCaps);
		mytapi.bLineAddressCapsAlloced=FALSE;
		myMessageBox("Error lineGetAddressCaps");
		return -1;
	}
	mytapi.dwAddress=i;

	if (mytapi.bLineTranslateCapsAlloced) {
		free(mytapi.pLineTranslateCaps);
		mytapi.bLineTranslateCapsAlloced=FALSE;
	}
	if (!(mytapi.pLineTranslateCaps=(LINETRANSLATECAPS *)calloc(1,sizeof(LINETRANSLATECAPS))))
		return LINEERR_NOMEM;
	mytapi.bLineTranslateCapsAlloced=TRUE;

	mytapi.pLineTranslateCaps->dwTotalSize=sizeof(LINETRANSLATECAPS);
	for (;;) {
		lrc=lineGetTranslateCaps(mytapi.hTAPI,
				mytapi.dwVersionToUse,mytapi.pLineTranslateCaps);
		if (lrc) {
			free(mytapi.pLineTranslateCaps);
			mytapi.bLineTranslateCapsAlloced=FALSE;
			return lrc;
		}

		dwsize=mytapi.pLineTranslateCaps->dwNeededSize;
		if (mytapi.pLineTranslateCaps->dwTotalSize<dwsize)
		{
			free(mytapi.pLineTranslateCaps);
			mytapi.bLineTranslateCapsAlloced=FALSE;
			mytapi.pLineTranslateCaps=(LINETRANSLATECAPS *)calloc(1,dwsize);
			if (!mytapi.pLineTranslateCaps) return LINEERR_NOMEM;
			mytapi.bLineTranslateCapsAlloced=TRUE;
			mytapi.pLineTranslateCaps->dwTotalSize=dwsize;
			continue;
		}
		break;
	} 

	lrc=mylineGetLineDevStatus();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -