📄 unit1.~pas
字号:
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 + -