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

📄 main.~cpp

📁 实现TAPI,Modem 拨号功能.应用了回调函数.
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>

#include "tapi.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TmyDecFrame *myDecFrame;//
TmyDecFrame *pwin=NULL;// 主 窗 口 指 针
char RecBuf[20],buf[20];// 缓 冲 区
DWORD Error; // 错 误 码
COMSTAT Status; // 状 态 码
DWORD NumLine; // 允 许 使 用 的 线 路 设 备 数
LINECALLPARAMS para;// 呼 叫 参 数

HLINEAPP myhTapi;// 线 路 应 用 程 序 句 柄
HLINE myhLine;// 线 路 句 柄
HANDLE myhModem;// 调 制 解 调 器 句 柄
HCALL myhCall;// 呼 叫 句 柄

typedef struct tagModemID{
        HANDLE hModem;
        char ModemName[1];
}ModemID;
//---------------------------------------------------------------------------
//获 取 调 制 解 调 器 句 柄 的 函 数 定 义
void GethModem(HLINE hLine)
{
  ModemID far *mid;
  VARSTRING * str;
  LONG lid;
  DWORD dwSize;
  char mark=1;

  str=(VARSTRING *)malloc(sizeof(VARSTRING));
  if(!str)
    return;
  str->dwTotalSize=sizeof(VARSTRING);
  do
  {
    if((lineGetID(myhLine,0,NULL,LINECALLSELECT_LINE,str,
      "comm/datamodem")==0)&&(str->dwTotalSize < str->dwNeededSize))
    {
      dwSize=str->dwNeededSize;
      free(str);
      str=(VARSTRING *)malloc(dwSize);
      if(!str)
      {
        myhModem=NULL;
        mark=2;
      }
      str->dwTotalSize=dwSize;
    }else{
      mark=0;
    }
  }while(mark==1);

  if(mark==0)
  {
    mid=(ModemID far *)((LPSTR)str+str->dwStringOffset);
    myhModem=mid->hModem;
  }
  free(str);
}
//---------------------------------------------------------------------------
__fastcall TmyDecFrame::TmyDecFrame(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TmyDecFrame::FormCreate(TObject *Sender)
{
//---- 4 在 主 窗 口 初 始 化 函 数 中 加 入 对 线 路 的 初 始 化 过 程:
  pwin=this;// 获 得 主 窗 口 指 针

/*  while(lineInitializeEx(&myhTapi,NULL,
   (LINECALLBACK)MakeProcInstance((FARPROC)lpfnCallback,
   GetModule()->GetInstance()), "TRY",&NumLine )==LINEERR_REINIT)
  {
    sleep(1);// 延 迟
  };
*/
  Error=lineOpen(myhTapi,0,&myhLine,0x10004,0,0,LINECALLPRIVILEGE_MONITOR+
        LINECALLPRIVILEGE_OWNER,LINEMEDIAMODE_DATAMODEM,NULL);
  if(Error!=0)
  {
    sprintf(buf,"%lx",Error);
    Application->MessageBox(buf, 0, MB_OK);
  }else{
    GethModem(myhLine);// 取 得myhModem 的 值
    if(myhModem!=NULL)
    {
      para.dwBearerMode=LINEBEARERMODE_VOICE;
      para.dwMediaMode=LINEMEDIAMODE_DATAMODEM;
      para.dwTotalSize=sizeof(LINECALLPARAMS);
      Error=lineMakeCall(myhLine,&myhCall,"8880751",0,&para);
      if(Error!=0)
      {
        sprintf(buf,"%lx",Error);
        Application->MessageBox(buf, 0, MB_OK);
      } 
    }
  }
}
//---------------------------------------------------------------------------
/*void  __fastcall TmyDecFrame::lpfnCallback(DWORD hDevice, DWORD dwMsg,
  DWORD dwCallbackInstance,DWORD dwParam1, DWORD dwParam2,DWORD dwParam3)//
//参数定义同lineCallbackFunc函数中的参数定义
{
  int Rec_num=0;
  switch(dwParam1)
  {
    case LINECALLSTATE_CONNECTED:
      DWORD len;
      ClearCommError(myhModem,&Error,&Status);
      Rec_num=Status.cbInQue;
      ReadFile(myhModem,RecBuf,Rec_num,&len,0);
//至此已经为数据通信做好了前期准备,可设立标志
      WriteFile(myhModem,"Success",7,&len,0);
      ReadFile(myhModem,RecBuf,8,&len,0);
      Application->MessageBox(RecBuf,0,MB_OK);
      break;
    case LINECALLSTATE_IDLE:
      lineDeallocateCall(myhCall);
      break;
    case LINECALLSTATE_DISCONNECTED:
      lineClose(myhLine);
      lineShutdown(myhTapi);
      break;
  }
}  */
//---------------------------------------------------------------------------
void  __fastcall TmyDecFrame::lpfnCallback(DWORD hDevice, DWORD dwMsg,
  DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2,DWORD dwParam3)
{
  int Rec_num=0;
  switch(dwParam3)
  {
    case LINECALLPRIVILEGE_OWNER:
      myhCall=(HCALL)hDevice;
      break;
  }//只有对呼叫具有私有特权的调用者才能应答呼叫,在此获得呼叫句柄
  switch(dwParam1)
  {
    case LINECALLSTATE_CONNECTED:
      DWORD len;
      ClearCommError(myhModem,&Error,&Status);
      Rec_num=ComS.cbInQue;
      ReadFile(myhModem,RecBuf,Rec_num,&len,0);// 清 除 接 收 缓 冲 区
      ReadFile(myhModem,RecBuf,7,&len,0);
      WriteFile(myhModem,"Received",8,&len,0);
      Application->MessageBox(RecBuf,0,MB_OK);
      break;
    case LINECALLSTE_OFFERING:
      lineAnswer(myhCall,NULL,0);
      break;// 完 成 自 动 应 答
    case LINECALLSTATE_IDLE:
      lineDeallocateCall(myhCall);
      break;
    case LINECALLSTATE_DISCONNECTED:
      lineClose(myhLine);
      lineShutdown(myhTapi);
      break;
  }
}

⌨️ 快捷键说明

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