怎样用程序控制通过MODEM拨号?(300分)

  • 主题发起人 黄文林
  • 开始时间

黄文林

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样用程序控制通过MODEM拨号,将一台电脑中的数据库传输到另一台电脑中去,
然后进行数据检验?
 
TurboPower控件可以的
 
你能否说得更清楚,例如有关代码?
 
怎样用程序控制通过MODOM拨号?
 
怎样用程序控制通过MODOM拨号?(急:另加400分!!!!!!!)
 
从连接Modem的串口发送atdt1234,就将拨号1234,关闭串口就可以挂机。
推荐使用TurboPower的Asyn Pro控件包。
 
TurboPower 哪里有下??
 
可以调用API,直接拨号就可以了。

如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Error:integer;
begin
Error:=winexec('rundll32.exe rnaui.dll,RnaDial'+'拨号连接因特网',9);
if Error=0 then
Showmessage('系统内存耗尽');
if Error=ERROR_BAD_FORMAT then
Showmessage('拨号程序是非法32位可执行程序');
if Error=ERROR_FILE_NOT_FOUND then
Showmessage('拨号程序么没有找到');
if Error=ERROR_PATH_NOT_FOUND then
Showmessage('拨号程序所在路径不正确');

end;

end.

 
这是一个老问题了,检索RASDIAL可以得到一堆答案,包括例程。
如果还步明白,发EMAIL给我。
 
查查以前的帖子,我贴过源程序
 
>>j_shen2000
你发E-MAIL给我吧!
不仅仅是拨号,将一台电脑中的数据库传输到另一台电脑中去,
然后进行数据检验?

>>huchunguo
拨号后,将一台电脑中的数据库传输到另一台电脑中去,
然后进行数据检验?

 
1、拨号的API函数原型:
function RasDial(
pRasDialExtensions : LPRASDIALEXTENSIONS;//在WIN9X下无用,可设置为NIL
lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空字符串
lpRasDialParams : LPRASDIALPARAMS;//拨号参数
dwNotifierType : DWORD;//消息通知方式
handle : TRasDialFunc;//消息处理事件
var lphRasConn : DWORD//返回的成功连接的连接句柄
) : DWORD; stdcall;
引用时:function RasDial;external RasApiDll name 'RasDialA';

同步例子:(异步只不过加了回调函数而已,注意必须在INTERFACE中引用RASDIAL)
var
RASDIALPARAMSData : RASDIALPARAMS;
dwResult : DWord;
RasCon : DWord;
begin
//指定拨号连接的拨号参数
with RASDIALPARAMSData do
begin
dwSize := sizeof( RASDIALPARAMS );//结构大小
szEntryName := '163';//指定拨号连接的名称
szUserName := 'MyName';//指定用户名称
szPassword := 'MyPassword';//指定用户密码
szDomain := 'MyDomain';//指定域名
szCallbackNumber := '';//指定回叫号码
szPhoneNumber := '';//指定拨号号码
end;

//用指定的拨号参数拨号,采用同步拨号方式
dwResult := RasDial( NIL,'',@RASDIALPARAMSData,0,NIL,RasCon );

if dwResult <> 0 then //设置指定拨号连接的拨号参数失败
memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName )+'拨号失败:'
+ GetRasError( dwResult ))
else
memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName )+'拨号成功!' );
end;
4、挂断
function RasHangUp(
hRasConn : DWORD//要挂断的拨号连接的句柄
) : DWORD; stdcall;
function RasHangUp;external RasApiDll name 'RasHangUpA';
    函数返回值为0表示执行成功;否则为错误代码.
    下面是一个应用例子,挂断由RasDial建立的拨号连接.

//挂断由RasDial建立的拨号连接
dwResult := RasHangUp( RasCon );
if dwResult <> 0 then //挂断失败
memo1.lines.add( '挂断失败:' + GetRasError( dwResult ))
else
memo1.lines.add( '挂断成功!');


》》》》》》》将一台电脑中的数据库传输到另一台电脑中去,然后进行数据检验?
也太笼统了吧!什么类型的数据库,DBASE、ACCESS、SQL7、ORACLE、DB2?同构、
异构?
如果是本地数据库,直接用SOCKET通信的方式将数据库文件当成文件流传输到目标机
上,只要SOCKET校验是正确的,文件本身也应该是正确的。如果同构,这就OK了,
如果异构,剩下的工作不过是单机的两个数据库BATCHMOVE而已。
如果是大型数据库,要根据实际情况而定,如果是内部网,一般连接稳定,可以考虑
用两个ADO,一个先把数据全部读进来,然后用另外一个ADO逐条读进另外一个库里,数据量
不大时,效率还不错;如果是同构数据库,干脆用数据库备份最简单。
如果是INTERNET+异构,用ADO倒或者远程备份都是不行的,这时最通用的方法就是生成
报文,报文可以是单机数据库文件、纯文本或者比较先进的XML报文,然后用SOCKET通信,
到目标机后,再拆分入库。
现在编程中的倒库工作大概思路就这些了,编程应该是你自己的事了吧。
 
>>j_shen2000
你在程序对拨号可以,只是....
小弟现在在作的程序是这样的:
由于公司办公地点与工厂相距十多公里,现在想在工厂设计一套程序,要求将工厂的数据
通过Modom拨号与办公司地点的服务器电脑相连,数据传输到服务器,然后进行数据检验?
确定数据完全正确,再导入到服务器中的数据库中。烦大侠帮助小弟,小弟一定感激不尽。
Delphi5.0+Access+Win9X
 
其实你的程序就是一个远程报帐而已。
首先你要能够保证将每天的更新数据分离出来。例如,每天的销售数据,可以通过
SELECT * FROM aaa WHERE 销售日期='2001-05-10';那些无法通过日期反映出来的更新
数据必须设定标志位等等,也就是说你要在数据库设计时保证客户端每天的更新数据必须
能够完整的生成报文。
报文的形式可以多种多样,可以是另外一个ACCESS文件,也可以是加了报文标志的文本
文件,生成报文的程序是很容易写的,前者不过是两个ADO,后者根据ADO生成文本。
报文传输可以用SOCKET、FTP、NMSTRM等等都可以。
SOCKET通信本身就是走TCP/IP,不用你写低层校验,你只要能够捕作通信异常就OK了,当然
加上断点续传就更好了,STREAM方式很好写断点续传的SOCKET传输。
为了保证数据正确,你可以用关键数据校验和的方式就可以了,比如日销售总额可以作为
一个关键数据,发送方将日销售总额写入报文,接受方将接到的报文中单品累加一下,再
和报文中的日销售总额对比一下,不就可以了吗?如果不放心,可以多加几个关键数据点,
不过这样拆分报文的速度就要受到影响了。
传输时再用ZIP算法压缩一下,或者用压缩流也行。
除了报文的方式以外,还可以用两个ADO直接进行操作,一个ADO的CONNECTSTRING接着
客户端的数据库,另外一个接着服务器端的数据库,大体上跟单机的两个数据库更新是
一致的,唯一不同的就是可能存在断线,因此必须要将标志位设好。
 
>>j_shen2000 大侠你好!!
你所答的给予我很大的启示,但我对网络编程不熟悉,
你能否给我发送有关源程序,如小弟得到你的指点,能完成所问的问题,
小弟一定将700分给你!!!!!!!!!!!!!!!!
 
>>j_shen2000 大侠你好!!
你所答的给予我很大的启示,但我对网络编程不熟悉,
你能否给我发送有关源程序?如小弟得到你的指点,能完成所问的问题,
小弟一定将700分奉上!!!!!!!!!!!!!!!!
 
挣你点分,真不容易。好吧,好人作到底了。
数据库结构设计,这个俺不了解你的需求,是无能为力的,只有靠你自己了,要切记必须
能够保证每天的数据都能单独提出生成报文,这是远程报帐的关键。
1、文件流压缩函数,引用zlib.
procedure compresstext(var compressedstream:tmemorystream;const compressionlevel:integer);
var
sourcestream:tcompressionstream;deststream:tmemorystream;count:integer;
begin
count:=compressedstream.Size;
try deststream:=tmemorystream.Create;
case compressionlevel of
0:sourcestream:=tcompressionstream.Create(clnone,deststream);
1:sourcestream:=tcompressionstream.Create(clfastest,deststream);
2:sourcestream:=tcompressionstream.Create(cldefault,deststream);
3:sourcestream:=tcompressionstream.Create(clmax,deststream);
end;
compressedstream.SaveToStream(sourcestream);sourcestream.Free;
compressedstream.Clear;compressedstream.WriteBuffer(count,sizeof(count));
compressedstream.CopyFrom(deststream,0);
finally deststream.Free;end;
end;
procedure uncompresstext(compressedstream:tmemorystream;destfn:string);
var sourcestream:tdecompressionstream;deststream:tmemorystream;buffer:pchar;count:integer;
begin
compressedstream.ReadBuffer(count,sizeof(count));getmem(buffer,count);
try deststream:=tmemorystream.Create;
sourcestream:=tdecompressionstream.Create(compressedstream);
sourcestream.ReadBuffer(buffer^,count);
deststream.WriteBuffer(buffer^,count);deststream.Position:=0;
deststream.SaveToFile(destfn);
finally freemem(buffer);deststream.Free;sourcestream.free;end;
end;
2、转贴唐晓峰的帖子,这个SOCKET传输程序是有效的,如果还是不能理解,那么用ftp吧,
简单省事,除了容易遭受FTP攻击外,其他倒没有什么大麻烦(一般对于普通应用,不会
有人这么吃饱没事干的)。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;

type
TCon = record
FileName : String;
TotalSize : Integer;
Status : Integer;
end;

PCON = ^TCON;

TForm1 = class(TForm)
SS: TServerSocket;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure SSClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
SS.Port := 9000;
SS.Active := True;
end;

procedure TForm1.SSClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var c : pcon;
begin

c :=new(pcon);
c.FileName := '';
c.TotalSize := 0 ;
c.Status := 0;
Socket.Data := c;
Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);

end;

procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var C : PCON;
cmd:String;
Buffer : pointer;
nRetr : integer;
fs : TFileStream;
const bufferSize = 1024 ;

begin
C:= Socket.Data ;
case c.Status of
0 :
begin
cmd := trim(Socket.ReceiveText) ;

if Pos('UPLOAD ',uppercase(cmd)) > 0 then
begin
c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
c.Status := 1;
Socket.Data := C;
Socket.SendText('you can send File !'#13#10);
end;
end;
1 : begin
GetMem(Buffer,BufferSize);
nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);

if not FIleExists('c:/'+c.FileName) then
begin
fs :=TFileStream.Create('c:/'+c.FileName,fmCreate or fmShareDenyNone);
fs.Seek(0,soFromBeginning);
end
else
begin
fs :=TFileStream.Create('c:/'+c.FileName,fmOpenWrite or fmShareDenyNone);
fs.Seek(0,soFromEnd);
end;

fs.WriteBuffer(Buffer^,nRetr);

fs.Destroy;
FreeMem(Buffer);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Show;
end;

end.




--------------------------------------------------------------------------------
来自:唐晓锋 时间:99-11-30 01:17:19 ID:162654
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;

type
TForm2 = class(TForm)
CS: TClientSocket;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
SendCommand: TButton;
Label1: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SendCommandClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.DFM}
function GetFileSize(const FileName: string):integer;
var f : TFileStream;
begin
f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
Result :=f.Size;
F.Free;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Execute;
if FileName <> '' then
begin
Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
Label1.Caption := FileName;
cs.Socket.SendText(edit1.Text);
end;
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
CS.Active := True;

end;

procedure TForm2.SendCommandClick(Sender: TObject);
var fs : TFileStream;
Buf : pointer;

begin
//CS.Socket.SendText(Edit1.Text+#13#10);
//Memo1.Lines.Add();
fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);

GetMem(Buf,fs.Size);
fs.Seek(0,soFromBeginning);

fs.ReadBuffer(Buf^,fs.Size);

memo1.Lines.Add('has send : '+inttostr(Cs.Socket.SendBuf(Buf^,fs.Size)));

end;

procedure TForm2.Button3Click(Sender: TObject);
begin
cs.Close;
end;

procedure TForm2.CSRead(Sender: TObject; Socket: TCustomWinSocket);
begin

Memo1.Lines.add(socket.receiveText);

end;

end.
3、FTP和NMSTRM都是控件,使用起来十分简单(虽然有很多不如意的地方),随便找本
入门书例程多多,不用让我麻烦了吧。
4、一种简单的报文格式:给你一个文本格式吧。例如,客户名称AAA,地址BBB,代码CCC,
其他DDD,AAA订购的商品有2种,分别是1商品和2商品,各自要素分别为价格12、23,单位
箱、桶,等等。报文格式可以这样:
UNT //表示报文开始,可以放置报文类型标志。
KHM AAA //KHM 表示这是一个客户的开始,一直到KHE为止都是这个客户的资料,包括他的
商品信息
KHD BBB
KHC CCC
SMC 1 //到此表示开始记录AAA的某种商品,这是商品名称,一直到SME为止都是AAA的
1商品的资料
。。。
SME
SMC 2 //第二种AAA的商品2,从此开始。
。。。
SME
KHE
KHM //第二个客户从此开始。
。。。
KHE
HHH 789 //表示该报文生成时,所记录的商品额总计。
HHD 5 //表示所涉及到的客户数量。这两项可以在拆分时用于解决数据校验的问题,当然
可以更多。
UNE //报文结束。
其中KHM 表示报文头,用来区分该行表示的内容,以对应相应的数据结构。
生成和拆分文本可以参看帮助中的TEXTFILE。
 
>>j_shen2000
感谢你多次为我答题,你的回答给了我很大的提示,再次谢谢!
分已送上,另外400分怎样给,请指点!!
 
顶部