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

📄 unit1.~pas

📁 delphi实现modem两地文件传输。
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
end;

end;

if dwNumberOfBytesRead>0 then

begin

Read_Os.Offset :=Read_Os.Offset+dwNumberOfBytesRead;

//ReceiveData := Read_Os.Offset;

// 处理接收的数据

//AddToMemo(InputBuffer,dwNumberOfBytesRead);
BlockWrite(ToF, InputBuffer, dwNumberOfBytesRead, NumWritten);

end;

end;

// 允许发送下一个WM_COMMNOTIFY消息

SetEvent(Post_Event);

end;





procedure GethModem(hLine:THLINE);
//var
//mid:ModemIDpointer;
//str:VarStringponiter;
//avarsting:TVarString;
//lid,dwsize:LongInt;
//mark:integer;
//hCall: THCall;
//a:PChar;
begin
lVarString := AllocMem(sizeof(lVarString^));
      lVarString^.dwTotalSize := sizeof(lVarString^);

     if lineGetID(hLine,0,Call,LINECALLSELECT_LINE,lVarString^,'comm/datamodem')<0 then
     ShowMessage('无法ModemID')else begin
      {---- Make sure we got all the Varstring}
      if lVarString^.dwNeededSize > lVarString^.dwTotalSize then
      begin
         ReallocMem(lVarString, lVarString^.dwNeededSize);
         lVarString^.dwTotalSize := lVarString^.dwNeededSize;
         lReturn := lineGetID(hLine, 0, Call, LINECALLSELECT_LINE, lVarString^, 'comm/datamodem');
         if lReturn < 0 then
         begin
            MessageDlg('Failed to get Line ID', mtError, [mbok], 0);
            lineDeallocateCall(Call);
            Exit;
         end;
      end;

      {---- Get the handle to the comm port}
      myhModem:= PHandle(PChar(lVarString) + SizeOf(TVarString))^;
      {---- Free the memory help by lpVarString}
      FreeMem(lVarString, lVarString^.dwTotalSize);
   end;
   end;


procedure lineCallback(hDevice,dwMsg,dwCallbackInstance,dwParam1,dwParam2,dwParam3:LongInt)//异步呼叫返回处理函数
{$IFDEF WIN32}
stdcall;
{$ELSE}
export;
{$ENDIF}
var
Ok : Boolean;

dcb : TDCB;

com_thread: Thandle;

ThreadID:DWORD;

Clear:Boolean;
Rec_num:DWORD;
//hCall: THCall;
//b:LongInt;
//len:LongInt;
begin
Rec_num:=0;
//if dwMsg = LINE_REPLY then { LineMakeCall的响应结果}
//if dwParam2 < 0 then {呼叫响应错误处理}
//else if dwMsg = LINE_CALLSTATE then { 呼叫状态信息 }



case dwParam3 of
	LINECALLPRIVILEGE_OWNER:
	    Call:= THCall(hDevice); //类型转换 THCall为LongInt类型
            else
end;
	//只有对呼叫具有私有特权的调用者才能应答呼叫,在此获得呼叫句柄


case dwParam1 of
LINECALLSTATE_IDLE: {呼叫无效处理}
if call <> 0 then
begin
lineDeallocateCall(Call);
end;
LINECALLSTATE_PROCEEDING:{呼叫正常处理};
LINECALLSTATE_DIALTONE:{检测到拨号音};
LINECALLSTATE_DIALING: {正在拨号};
LINECALLSTATE_CONNECTED:
begin

lVarString := AllocMem(sizeof(lVarString^));
      lVarString^.dwTotalSize := sizeof(lVarString^);

      lineGetID(0, 0, Call, LINECALLSELECT_CALL, lVarString^, 'comm/datamodem');
      {---- Make sure we got all the Varstring}
      if lVarString^.dwNeededSize > lVarString^.dwTotalSize then
      begin
         ReallocMem(lVarString, lVarString^.dwNeededSize);
         lVarString^.dwTotalSize := lVarString^.dwNeededSize;
         lReturn := lineGetID(0, 0, Call, LINECALLSELECT_CALL, lVarString^, 'comm/datamodem');
         if lReturn < 0 then
         begin
            MessageDlg('Failed to get Line ID', mtError, [mbok], 0);
            LineDrop(call, nil, 0);
            Exit;
         end;
      end;

      {---- Get the handle to the comm port}
      hCommFile := PHandle(PChar(lVarString) + SizeOf(TVarString))^;
      if  hCommFile=0 or hCommFile=null then
      MessageDlg('Error establishing connection.', mtError, [mbok], 0)
      else
      //try
         //StartComm(hCommFile);
      //except
         //if hCommFile <> 0 then
            //CloseHandle(hCommFile);
         //DropCall;
         //raise;
      //end;
      {---- Free the memory help by lpVarString}
      begin
      FreeMem(lVarString, lVarString^.dwTotalSize);
   //except





		   Clear:=ClearCommError(hCommFile,Error,nil);
                   if Clear Then Begin
                   Ok:=SetCommMask(hCommFile,EV_RXCHAR);

if ( not Ok) then

begin

MessageBox(0,'SetCommMask Error!','Notice',MB_OK);

Exit;

end;




//                    setcommMask(hCommFile,ev_rxchar);
FillChar(Read_Os,SizeOf(Read_Os),0);

Read_Os.Offset := 0;

Read_Os.OffsetHigh := 0;

// Create Event for Overlapped Read

Read_Os.hEvent :=CreateEvent(nil,true,False,nil);

if Read_Os.hEvent=null then

begin

CloseHandle(hCommFile);

MessageBox(0,'CreateEvent Error!','Notice',MB_OK);

Exit;

end;

// Create Event for PostMessage

Post_Event:=CreateEvent(nil,True,True,nil);

if Post_Event=null then

begin

CloseHandle(hCommFile);

CloseHandle(Read_Os.hEvent);

MessageBox(0,'CreateEvent Error!','Notice',MB_OK);

Exit;

end;

// 建立通信监视线程

Com_Thread:=CreateThread(nil,0,@CommWatch,nil,0,ThreadID);

if (Com_Thread=0) then

//MessageBox(Handle,'No CraeteThread!',nil,mb_OK);

EscapeCommFunction(hCommFile,SETDTR);

form1.Label1.Font.Color :=clRed;

form1.Label1.Caption:='正在接收数据...!';

end;






                    post_event:=CreateEvent(nil,true,true,nil); // 创 建 同 步 事 件;
                     Tcomm.Create(False);            // 创 建 串 行 口 监 视 线 程;
         	//Rec_num:=Status.cbInQue;// bytes in input buffer
   			//ReadFile(myhModem,RecBuf,Rec_num,len,lpol);
                        //ReadFile(myhModem,Read_Buffer,Rec_num,len,nil);
//至此已经为数据通信做好了前期准备,可设立标志
                //ReadFile(hCommFile,Read_Buffer,7,len,nil);
    		//WriteFile(hCommFile,'Received',8,len,nil);
                //ShowMessage(IntToStr(Read_Buffer));
                 //MessageBox(RecBuf,0,MB_OK);

      		//WriteFile(myhModem,'Success',7,len,nil);
			//ReadFile(myhModem,Read_Buffer,8,len,nil);
			//MessageBox(Read_Buffer,'hello',MB_OK);
                      end;
                      end;

LINECALLSTATE_OFFERING:
			lineAnswer(Call,nil,0);

LINECALLSTATE_DISCONNECTED: {连接已断开}
begin
{断开原因}
if dwParam2=LINEDISCONNECTMODE_NORMAL then{正常断开}
else if dwParam2=LINEDISCONNECTMODE_BUSY then{线路忙}
//b:=LINECALLSTATE_BUSY{线路忙处理};
end;
end;
end;




procedure dial(dialnumber:string);//dialnumber为电话号码字符串
//var
  //lineApp:THLineApp;//TAPI应用句柄
    //line:THLine;//线路句柄
    //call:THCall;//呼叫句柄
    //CallParams:TLineCallParams;//呼叫参数
    //A,nDevs,tapiVersion,errorcod:Longint;//线路设备数、TAPI版本号、错误代码
    //extid:TLineExtensionID;//TAPI扩展版本号
    //lineIcon:HICON;//线路设备图标

begin
//with CallParams do {CallParams的类型参考VC中的定义,将DWORD改为LongInt}
//begin
    //dwTotalSize:=20000000;
    //dwBearerMode:=LINEBEARERMODE_VOICE;//承载模式为语音
    //dwMediaMode:=LINEMEDIAMODE_INTERACTIVEVOICE;//媒体模式为交互式语音
   //end;

end;



procedure TForm1.Button1Click(Sender: TObject);
begin

if lineInitialize(lineApp,HInstance,@lineCallBack,nil,nDevs)<0
then ShowMessage('线路不能初始化处理')//线路不能初始化处理
else
if nDevs=0 then //无TAPI线路设备
 begin
   lineShutDown(lineApp);
   lineApp:=0;
   ShowMessage('无TAPI线路设备');
    end
  else
if lineNegotiateAPIVersion(lineApp,0,$00010003,$00030001,tapiVersion,extid)<0 //协商TAPI版本号 TAPI1.4~TAPI2.0
then begin {TAPI版本不兼容}
lineShutDown(lineApp);
lineApp:=0;
ShowMessage('TAPI版本不兼容');
end
else
//打开线路
 FillChar(CallParams, sizeof(CallParams), 0);
   with CallParams do
   begin
      dwTotalSize := sizeof(CallParams);
      dwBearerMode := LINEBEARERMODE_VOICE;
      dwMediaMode := LINEMEDIAMODE_DATAMODEM;
   end;

   if lineOpen(lineApp,0,line,tapiVersion,0,0,LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER ,LINEMEDIAMODE_DATAMODEM,@CallParams)<0 then
   begin
      lineShutDown(lineApp);
      lineApp := 0;
      line := 0;
   end;
   if line = 0 then
      MessageDlg('Error Initialising Data Communications', mtError, [mbok], 0);
//打开线路
{线路不能打开}

//begin{线路打开成功}
//lineConfigDialog(0,Form1.Handle,nil); //显示线路设备属性
//lineGetIcon(0,'tapi/line',lineIcon);
//lineIcon为线路设备图标句柄,可以赋值给TICON.Handle


//begin
//with CallParams do {CallParams的类型参考VC中的定义,将DWORD改为LongInt}
//begin
    //dwTotalSize:=200000;
    //dwBearerMode:=LINEBEARERMODE_VOICE;//承载模式为语音
    //dwMediaMode:=LINEMEDIAMODE_DATAMODEM;//媒体模式为交互式语音
   //end;

//else
//lineHandOff(call,'电话拨号程序',LINEMEDIAMODE_INTERACTIVEVOICE);
//在程序中应当以按钮来触发lineHandOff,从TAPI控制转为人工控制电话
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
if SaveDialog1.Execute then      { Display Save dialog box}
    begin
    form1.Edit1.Text:=SaveDialog1.FileName;
      AssignFile(ToF, form1.Edit1.Text);	{ Open output file }

      Rewrite(ToF, 1);	{ Record size = 1 }
    end;
end;

end.

⌨️ 快捷键说明

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