📄 faxmachinedlg.cpp
字号:
"SmartFaxSample",
&g_dwNumDevs,
&dwAPIVersion,
&lineInitializeExParams);
}
else
{
lReturn = lineInitializeEx(&g_hLineApp,
hInstance,
lineCallbackFuncRcv,
"SmartFaxSample",
&g_dwNumDevs,
&dwAPIVersion,
&lineInitializeExParams);
}
#else
//不支持UNICODE
if(bSendNotRcv)
{
lReturn = lineInitialize(&g_hLineApp,
hInstance,
lineCallbackFuncSend,
"SmartFaxSample",
&g_dwNumDevs);
}
else
{
lReturn = lineInitialize(&g_hLineApp,
hInstance,
lineCallbackFuncRcv,
"SmartFaxSample",
&g_dwNumDevs);
}
#endif
//其他程序已经响应了REINIT消息,等5s后重试
//若仍旧,则提示用户
if (lReturn == LINEERR_REINIT)
{
if (bTryReInit)
{
MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = GetTickCount();
while(GetTickCount() - dwTimeStarted < 5000)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
bTryReInit = FALSE;
continue;
}
else
{
AfxMessageBox("初始化失败!");
g_bInitializing = FALSE;
return FALSE;
}
}
if (lReturn == LINEERR_NODEVICE)
{
AfxMessageBox("没有找到设备!\n");
g_bInitializing = FALSE;
return FALSE;
}
else if(lReturn != SUCCESS)
{
AfxMessageBox("线路初始化错误: ");
g_bInitializing = FALSE;
return FALSE;
}
} while(lReturn != SUCCESS);
LINEEXTENSIONID LineExtensionID;
if (lReturn = lineNegotiateAPIVersion(g_hLineApp,
dwDeviceID,
0x00010004,
TAPI_MAX_VERSION,
&dwAPIVersion,
&LineExtensionID))
{
g_bInitializing = FALSE;
return FALSE;
}
lpDevCaps = (LINEDEVCAPS *)malloc(sizeof(LINEDEVCAPS)+1000);
if(!lpDevCaps)
{
TRACE("Out of memory \n");
g_bInitializing = FALSE;
return FALSE;
}
memset(lpDevCaps, 0, sizeof(LINEDEVCAPS)+1000);
lpDevCaps->dwTotalSize = sizeof(LINEDEVCAPS)+1000;
if( (lReturn = lineGetDevCaps(g_hLineApp,
dwDeviceID,
dwAPIVersion,
0,
lpDevCaps)) != SUCCESS)
{
free(lpDevCaps);
g_bInitializing = FALSE;
return FALSE;
}
if (!(lpDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM))
{
free(lpDevCaps);
g_bInitializing = FALSE;
return FALSE;
}
free(lpDevCaps);
g_tInitTime = time(NULL);
if (lReturn = lineOpen(g_hLineApp,
dwDeviceID,
&g_hLine,
dwAPIVersion,
0,
g_tInitTime,
LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM,
NULL))
{
if(0x80000048)
{
AfxMessageBox("TAPI Modem无法使用!");
}
g_bInitializing = FALSE;
return FALSE;
}
if( (lReturn = lineSetStatusMessages(g_hLine,
0x1ffffff,
0) ) )
{
g_bInitializing = FALSE;
return FALSE;
}
g_bInitializing = FALSE;
g_bTapiInUse = TRUE;
return TRUE;
}
//
// FUNCTION: BOOL ShutdownTAPI()
//
// PURPOSE: Shuts down all use of TAPI
//
// PARAMETERS:
// None
//
// RETURN VALUE:
// True if TAPI successfully shut down.
//
// COMMENTS:
//
// If ShutdownTAPI fails, then its likely either a problem
// with the service provider (and might require a system
// reboot to correct) or the application ran out of memory.
//
//
BOOL ShutdownTAPI()
{
long lReturn;
if (g_hLineApp == NULL)
return TRUE;
if (g_bShuttingDown)
return TRUE;
g_bShuttingDown = TRUE;
lineDrop(g_hCall, NULL, 0);
lineDeallocateCall(g_hCall);
lineClose(g_hLine);
do
{
lReturn = lineShutdown(g_hLineApp);
} while(lReturn != SUCCESS);
g_bTapiInUse = FALSE;
g_bConnected = FALSE;
g_hLineApp = NULL;
g_hCall = NULL;
g_hLine = NULL;
g_bShuttingDown = FALSE;
return TRUE;
}
//将TAPI线路错误信息转换为字符串
/*LPTSTR FormatTapiError (long lError)
{
static LPTSTR pszLineError[] =
{
TEXT("LINEERR No Error"),
TEXT("LINEERR_ALLOCATED"),
TEXT("LINEERR_BADDEVICEID"),
TEXT("LINEERR_BEARERMODEUNAVAIL"),
TEXT("LINEERR Unused constant, ERROR!!"),
TEXT("LINEERR_CALLUNAVAIL"),
TEXT("LINEERR_COMPLETIONOVERRUN"),
TEXT("LINEERR_CONFERENCEFULL"),
TEXT("LINEERR_DIALBILLING"),
TEXT("LINEERR_DIALDIALTONE"),
TEXT("LINEERR_DIALPROMPT"),
TEXT("LINEERR_DIALQUIET"),
TEXT("LINEERR_INCOMPATIBLEAPIVERSION"),
TEXT("LINEERR_INCOMPATIBLEEXTVERSION"),
TEXT("LINEERR_INIFILECORRUPT"),
TEXT("LINEERR_INUSE"),
TEXT("LINEERR_INVALADDRESS"),
TEXT("LINEERR_INVALADDRESSID"),
TEXT("LINEERR_INVALADDRESSMODE"),
TEXT("LINEERR_INVALADDRESSSTATE"),
TEXT("LINEERR_INVALAPPHANDLE"),
TEXT("LINEERR_INVALAPPNAME"),
TEXT("LINEERR_INVALBEARERMODE"),
TEXT("LINEERR_INVALCALLCOMPLMODE"),
TEXT("LINEERR_INVALCALLHANDLE"),
TEXT("LINEERR_INVALCALLPARAMS"),
TEXT("LINEERR_INVALCALLPRIVILEGE"),
TEXT("LINEERR_INVALCALLSELECT"),
TEXT("LINEERR_INVALCALLSTATE"),
TEXT("LINEERR_INVALCALLSTATELIST"),
TEXT("LINEERR_INVALCARD"),
TEXT("LINEERR_INVALCOMPLETIONID"),
TEXT("LINEERR_INVALCONFCALLHANDLE"),
TEXT("LINEERR_INVALCONSULTCALLHANDLE"),
TEXT("LINEERR_INVALCOUNTRYCODE"),
TEXT("LINEERR_INVALDEVICECLASS"),
TEXT("LINEERR_INVALDEVICEHANDLE"),
TEXT("LINEERR_INVALDIALPARAMS"),
TEXT("LINEERR_INVALDIGITLIST"),
TEXT("LINEERR_INVALDIGITMODE"),
TEXT("LINEERR_INVALDIGITS"),
TEXT("LINEERR_INVALEXTVERSION"),
TEXT("LINEERR_INVALGROUPID"),
TEXT("LINEERR_INVALLINEHANDLE"),
TEXT("LINEERR_INVALLINESTATE"),
TEXT("LINEERR_INVALLOCATION"),
TEXT("LINEERR_INVALMEDIALIST"),
TEXT("LINEERR_INVALMEDIAMODE"),
TEXT("LINEERR_INVALMESSAGEID"),
TEXT("LINEERR Unused constant, ERROR!!"),
TEXT("LINEERR_INVALPARAM"),
TEXT("LINEERR_INVALPARKID"),
TEXT("LINEERR_INVALPARKMODE"),
TEXT("LINEERR_INVALPOINTER"),
TEXT("LINEERR_INVALPRIVSELECT"),
TEXT("LINEERR_INVALRATE"),
TEXT("LINEERR_INVALREQUESTMODE"),
TEXT("LINEERR_INVALTERMINALID"),
TEXT("LINEERR_INVALTERMINALMODE"),
TEXT("LINEERR_INVALTIMEOUT"),
TEXT("LINEERR_INVALTONE"),
TEXT("LINEERR_INVALTONELIST"),
TEXT("LINEERR_INVALTONEMODE"),
TEXT("LINEERR_INVALTRANSFERMODE"),
TEXT("LINEERR_LINEMAPPERFAILED"),
TEXT("LINEERR_NOCONFERENCE"),
TEXT("LINEERR_NODEVICE"),
TEXT("LINEERR_NODRIVER"),
TEXT("LINEERR_NOMEM"),
TEXT("LINEERR_NOREQUEST"),
TEXT("LINEERR_NOTOWNER"),
TEXT("LINEERR_NOTREGISTERED"),
TEXT("LINEERR_OPERATIONFAILED"),
TEXT("LINEERR_OPERATIONUNAVAIL"),
TEXT("LINEERR_RATEUNAVAIL"),
TEXT("LINEERR_RESOURCEUNAVAIL"),
TEXT("LINEERR_REQUESTOVERRUN"),
TEXT("LINEERR_STRUCTURETOOSMALL"),
TEXT("LINEERR_TARGETNOTFOUND"),
TEXT("LINEERR_TARGETSELF"),
TEXT("LINEERR_UNINITIALIZED"),
TEXT("LINEERR_USERUSERINFOTOOBIG"),
TEXT("LINEERR_REINIT"),
TEXT("LINEERR_ADDRESSBLOCKED"),
TEXT("LINEERR_BILLINGREJECTED"),
TEXT("LINEERR_INVALFEATURE"),
TEXT("LINEERR_NOMULTIPLEINSTANCE")
};
_declspec(thread) static TCHAR szError[512];
DWORD dwError;
HMODULE hTapiUIMod = GetModuleHandle(TEXT("TAPIUI.DLL"));
if (hTapiUIMod)
{
dwError = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,
(LPCVOID)hTapiUIMod,
TAPIERROR_FORMATMESSAGE(lError),
0,
szError,
sizeof(szError)/sizeof(TCHAR),
NULL);
if (dwError)
return szError;
}
//与调高位,使dwError是正值
dwError = (DWORD)lError & 0x7FFFFFFF;
if ((lError > 0) || (dwError > sizeof(pszLineError)/sizeof(pszLineError[0])))
{
wsprintf(szError, TEXT("Unknown TAPI error code: 0x%lx"), lError);
return szError;
}
return pszLineError[dwError];
}*/
void CFaxMachineDlg::OnSendfax()
{
// TODO: Add your control notification handler code here
m_Time="";
m_ActualSpeed="";
m_Page="0";
this->UpdateData(false);
if(m_PortType==0) //通过Tapi发送
{
int nSel = m_ModemList.GetCurSel();
DWORD dwDevice = m_ModemList.GetItemData(nSel);
if(dwDevice >=0 )
{
InitializeTAPI(dwDevice);
InitFaxTapiCall(g_hLine,g_hCall);
}
}else //通过Com端口发送
{
ComPortSendFax();
}
}
int CFaxMachineDlg::ComPortSendFax()
{
this->GetDlgItem(IDC_SENDFAX)->EnableWindow(false);
this->GetDlgItem(IDC_EXIT)->EnableWindow(false);
this->UpdateData();
//声明SFaxParam型对象Sender
SFaxParam *Sender =(SFaxParam *) new SFaxParam;
//初始化Sender
Sender->hFax = &g_hFax;
strcpy(Sender->FileName,m_File);
strcpy(Sender->FaxNumber,m_Phone) ;
Sender->Hwnd = this->GetSafeHwnd();
Sender->Msg = WM_SMARTFAX;
Sender->nComPort = m_PortType;
Sender->Speed = GetSelSpeed(m_FaxSpeed);
Sender->Is2D = m_Compress == TRUE ? U2D_ENABLE : U2D_DISABLE ;
Sender->CreateHead = m_Ecm == TRUE ? CH_ENABLE : CH_DISABLE;
Sender->Class = m_FaxProtocol == 0 ? CLASS_1 : CLASS_2 ;
strcpy(Sender->Identifi,m_Identity);
Sender->Ecm = m_Ecm == TRUE ? ECM_ENABLE : ECM_DISABLE ;
Sender->Volume = GetFaxVolume(m_Volume) ;
strcpy(Sender->From,m_From);
strcpy(Sender->To,m_To);
Sender->nStartPage = 1 ;
Sender->Resolution = m_HighResolution == 0 ? RE_FINE : RE_STANDARD ;
//调用端口发送传真函数SmartSendFax
int rc = SmartSendFax(Sender);
//释放对象
delete Sender;
return rc;
}
//*********************************************
//********** WM_SMARTFAX消息处理函数 *********
//*********************************************
void CFaxMachineDlg::OnSmartFax(WPARAM wParam, LPARAM lParam)
{
if(bSendNotRcv)
{
//当前是发送传真操作
static unsigned long faxdata = 0 ;
this->UpdateData();
switch(wParam)
{
case WM_FAXUSERCANCE:
{
m_Status = "用户取消发送传真";
ShutdownTAPI();
break;
}
case WM_FAXMISSIONOUTOVER:
{
ShutdownTAPI();
GetDlgItem(IDC_SENDFAX)->EnableWindow(true);
GetDlgItem(IDC_EXIT)->EnableWindow(true);
GetDlgItem(IDC_ABORT)->EnableWindow(false);
switch (lParam)
{
case 0:
{
m_Status = "成功发送传真。";
break;
}
case 888:
{
m_Status = "传真发送失败(因用户取消)。";
break;
}
default:
{
m_Status = "传真发送失败!";
break;
}
}
KillTimer(100);
}
break;
case WM_FAXCHANGESTATE:
{
switch(lParam)
{
case FAXINIT:
{
m_bEcmFlag = false ;
m_nTimes = 0 ;
SetTimer(100,1000, 0);
m_Remote="";
faxdata = 0;
m_Data.Format("%dK",0);
GetDlgItem(IDC_SENDFAX)->EnableWindow(false);
GetDlgItem(IDC_EXIT)->EnableWindow(false);
GetDlgItem(IDC_ABORT)->EnableWindow(true);
m_Status = "初始化设备。";
this->UpdateData(false);
break;
}
case DIALFAX:
{
m_Status = "拨号……";
break;
}
case ANSWER:
{
m_Status = "应答……";
break;
}
case NEGOTIATION:
{
m_Status = "协商版本……";
break;
}
case TRAINING:
{
m_Status = "训练……";
break;
}
}
}
break;
case WM_FAXSETCIS:
{
m_Remote.Format("%s",(char*)lParam );
m_Remote.TrimLeft(" ");
m_Remote.TrimRight(" ");
break;
}
case WM_FAXSENDPAGEDATA:
{
faxdata+=(long)lParam;
m_Data.Format("%dK",faxdata/1024);
break;
}
case WM_ACCEPTPAGE:
{
m_Status = "接受页 ……";
break;
}
case WM_REJECTPAGE:
{
m_Status = "弹出页 ……";
break;
}
case WM_FAXSPEED:
{
m_ActualSpeed.Format("%d%s",lParam,"00 bps");
break;
}
case WM_FAXPAGE:
{
m_nPage = (int)lParam;
m_Page.Format("Page %d",m_nPage);
break;
}
case WM_FAXECM:
{
m_bEcmFlag = lParam == 0 ? false : true ;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -