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

📄 faxmachinedlg.cpp

📁 VisualC实践与提高——串口通信与工程应用篇代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
								"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 + -