网络和通讯编程

    技术2022-05-11  56

    打开拨号连接
      调用拨号网络里的拨号程序来连接:其中'连接Internet'为你创建的拨号程序名称winexec('rundll32.exe rnaui.dll,RnaDial '+'连接Internet',9);
    一个串口通讯的问题?
    Serial Port Communications?问I want to build a simple electrical controller which receives input from asensor through a comm port and either turns a power source(s) on or offbased upon this signal. I want this controller to be software in nature.How do I communicate through the port and is it possible to discern changesin voltage.If not, what kind of signal must be input.答When you want to write and read only binary signals you can use the printerparallel port. For that purpose the Port command is useful. In the below anexample of some D1 code used for bidirectional 2 wire bus communication (I2C).BaseAddress is $278, $378 or $3BC, depending on the LPT port used forcommunication.There is a 'but'. In D1 the port function was available but not documented. InD2 and D3 it seems to have disappeared entirely (Please somebody correct me ifthis is wrong).We are using the parallel printer port with attached a small interface cardwith some I/O buffering for control of RF modules. Could somebody indicatewhether the Port function still exist or what the alternative could be ?regards,Hans BrekelmansPROCEDURE SetIICline(Terminal: IICterminalTypes; High: Boolean);Var Count : Word;      CtrlAddress: word;Begin { set iic line }  CtrlAddress:=BaseAddress+2;  Case Terminal of    SCL : if High then Port[CtrlAddress]:=$08 else Port[CtrlAddress]:=$00;    SDA : if NOT High then Port[BaseAddress]:=$80 else Port[BaseAddress]:=$00;  END;  For Count := 1 to ClockDelay do;End; {SetIICline}FUNCTION GetIICline(Terminal: IICterminalTypes): Boolean;const SDA_IN=$80; { SDA: 25 pin #11, status, NOT BUSY, bit 7 }         SCL_IN=$08; { SCL: 25 pin #15, status, NOT Error, bit 3 }var Count : Word;    ReadAddress: word;Begin   ReadAddress:=BaseAddress+1;   CASE Terminal OF     SCL: GetIICline:=((Port[ReadAddress] AND SCL_IN) = SCL_IN);     SDA: GetIICline:=((Port[ReadAddress] AND SDA_IN) = SDA_IN); { read sdapin }   END;   For Count := 1 to ClockDelay do;End;
    得到本机IP地址?
    How about using winsockets?This code is untested and ugly.program get_ip;uses  winsock,sysutils;VAR  ch : ARRAY[1..32] OF Char;  i : Integer;  WSData: TWSAData;  MyHost: PHostEnt;begin  IF WSAstartup(2,wsdata)<>0 THEN    BEGIN      Writeln('can''t start Winsock: Error ',WSAGetLastError);      Halt(2);    END;  try    IF getHostName(@ch[1],32)<>0 THEN      BEGIN        Writeln('getHostName failed');        Halt(3);      END;  except    Writeln('getHostName failed');    halt(3);  end;  MyHost:=GetHostByName(@ch[1]);  IF MyHost=NIL THEN    BEGIN      Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error'+IntToStr(WSAGetLastError));      Halt(4);    END  ELSE    BEGIN        Write('address ');         FOR i:=1 TO 4 DO            BEGIN              Write(Ord(MyHost.h_addr^[i-1]));              IF i<4 THEN                write('.')              ELSE                writeln;            END;   END;end.
    任何动态改变/添加网络设置中的 TCP/IP 的 DNS 地址
    例如,把 DNS Server的地址添加为192.0.0.1和192.1.1.0,可调用:SetTCPIPDNSAddresses('192.0.0.1 192.1.1.0') ;// 各地址之间用一个空格隔开1. SetTCPIPDNSAddresses 定义如下:procedure SetTCPIPDNSAddresses( sIPs : string );begin//// if using Windows NT//SaveStringToRegistry_LOCAL_MACHINE('SYSTEM/CurrentControlSet' +'/Services/Tcpip/Parameters','NameServer',sIPs );//// if using Windows 95//SaveStringToRegistry_LOCAL_MACHINE('SYSTEM/CurrentControlSet' +'/Services/VxD/MSTCP','NameServer',sIPs );end;2. 其中 SaveStringToRegistry_LOCAL_MACHINE 定义:uses Registry;procedure SaveStringToRegistry_LOCAL_MACHINE(sKey, sItem, sVal : string );varreg : TRegIniFile;beginreg := TRegIniFile.Create( '' );reg.RootKey := HKEY_LOCAL_MACHINE;reg.WriteString( sKey, sItem, sVal + #0 );reg.Free;end;
    如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名?
    可参考下面代码,或许有所帮助:procedure GetDomainList(TV:TTreeView);vara : Integer;ErrCode : Integer;NetRes : Array[0..1023] of TNetResource;EnumHandle : THandle;EnumEntries : DWord;BufferSize : DWord;s : string;itm : TTreeNode;begin{ Start here }tryWith NetRes[0] do begindwScope :=RESOURCE_GLOBALNET;dwType :=RESOURCETYPE_ANY;dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;dwUsage :=RESOURCEUSAGE_CONTAINER;lpLocalName :=NIL;lpRemoteName :=NIL;lpComment :=NIL;lpProvider :=NIL;end;{ get net root }ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle);If ErrCode=NO_ERROR then beginEnumEntries:=1;BufferSize:=SizeOf(NetRes);ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);WNetCloseEnum(EnumHandle);ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle);EnumEntries:=1024;BufferSize:=SizeOf(NetRes);ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);IF ErrCode=No_Error then with TV do trya:=0;Items.BeginUpDate;Items.Clear;Itm:=Items.Add(TV.Selected,string(NetRes[0].lpProvider));Itm.ImageIndex:=0;Itm.SelectedIndex:=0;{ get domains }下面的一个单元定义了一个组件. TNetworkBrowser, 可以枚举hierachical树上所有的网络资源. 实际上浏览是要花费很长时间的,这您可以通过在WINDOWS资源管理器中打开"整个网络" 来比较一下. 如果你设置SCOPE属性 为nsContext , 你就可以看到和网络邻居中一样的机器列表.unit NetBrwsr;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;typeTNetScope = (nsConnected, nsGlobal, nsRemembered, nsContext);TNetResourceType = (nrAny, nrDisk, nrPrint);TNetDisplay = (ndDomain, ndGeneric, ndServer, ndShare, ndFile, ndGroup,ndNetwork, ndRoot, ndShareAdmin, ndDirectory, ndTree, ndNDSContainer);TNetUsage = set of (nuConnectable, nuContainer);TNetworkItems = class;TNetworkItem = classprivateFScope: TNetScope;FResourceType: TNetResourceType;FDisplay: TNetDisplay;FUsage: TNetUsage;FLocalName: string;FRemoteName: string;FComment: string;FProvider: string;FSubItems: TNetworkItems;publicconstructor Create;destructor Destroy; override;property Scope: TNetScope read FScope;property ResourceType: TNetResourceType read FResourceType;property Display: TNetDisplay read FDisplay;property Usage: TNetUsage read FUsage;property LocalName: string read FLocalName;property RemoteName: string read FRemoteName;property Comment: string read FComment;property Provider: string read FProvider;property SubItems: TNetworkItems read FSubItems;end;TNetworkItems = classprivateFList: TList;procedure SetItem(Index: Integer; Value: TNetworkItem);function GetItem(Index: Integer): TNetworkItem;function GetCount: Integer;publicconstructor Create;destructor Destroy; override;procedure Clear;procedure Add(Item: TNetworkItem);procedure Delete(Index: Integer);property Items[Index: Integer]: TNetworkItem read GetItem writeSetItem; default;property Count: Integer read GetCount;end;TNetworkBrowser = class(TComponent)privateFItems: TNetworkItems;FScope: TNetScope;FResourceType: TNetResourceType;FUsage: TNetUsage;FActive: Boolean;procedure Refresh;procedure SetActive(Value: Boolean);procedure SetScope(Value: TNetScope);procedure SetResourceType(Value: TNetResourceType);procedure SetUsage(Value: TNetUsage);procedure EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource);protectedpublicconstructor Create(AOwner: TComponent); override;destructor Destroy; override;procedure Open;procedure Close;property Items: TNetworkItems read FItems;publishedproperty Scope: TNetScope read FScope write SetScope default nsGlobal;property ResourceType: TNetResourceType read FResourceTypewrite SetResourceType default nrAny;property Usage: TNetUsage read FUsage write SetUsage default [];property Active: Boolean read FActive write SetActive default False;end;implementationtypePNetResourceArray = ^TNetResourceArray;TNetResourceArray = array[0..0] of TNetResource;{ TNetworkItem }constructor TNetworkItem.Create;begininherited;FSubItems := TNetworkItems.Create;end;destructor TNetworkItem.Destroy;beginif FSubItems <> nil thenFSubItems.Free;inherited;end;{ TNetworkItems }constructor TNetworkItems.Create;begininherited;FList := TList.Create;end;destructor TNetworkItems.Destroy;beginClear;if FList <> nil thenFList.Free;inherited;end;procedure TNetworkItems.SetItem(Index: Integer; Value: TNetworkItem);beginif (FList.Items[Index] <> nil) and (FList.Items[Index] <> Value) thenTNetworkItem(FList.Items[Index]).Free;FList.Items[Index] := Value;end;function TNetworkItems.GetItem(Index: Integer): TNetworkItem;beginResult := TNetworkItem(FList.Items[Index]);end;procedure TNetworkItems.Clear;beginwhile Count > 0 doDelete(0);end;procedure TNetworkItems.Add(Item: TNetworkItem);beginFList.Add(Item);end;procedure TNetworkItems.Delete(Index: Integer);beginif FList.Items[Index] <> nil thenTNetworkItem(FList.Items[Index]).Free;FList.Delete(Index);end;function TNetworkItems.GetCount: Integer;beginif FList <> nil thenResult := FList.CountelseResult := 0;end;{ TNetworkBrowser }constructor TNetworkBrowser.Create(AOwner: TComponent);begininherited Create(AOwner);FItems := TNetworkItems.Create;FScope := nsGlobal;FResourceType := nrAny;FUsage := [];end;destructor TNetworkBrowser.Destroy;beginif FItems <> nil thenFItems.Free;inherited;end;procedure TNetworkBrowser.EnumerateNet(NetItems: TNetworkItems; lpnr:PNetResource);vardwResult, dwResultEnum: Integer;hEnum: THandle;cbBuffer, cEntries, i: Integer;nrArray: PNetResourceArray;NewItem: TNetworkItem;dwScope, dwType, dwUsage: Integer;begincbBuffer := 16384;cEntries := $FFFFFFFF;case FScope ofnsConnected: dwScope := RESOURCE_CONNECTED;nsGlobal: dwScope := RESOURCE_GLOBALNET;nsRemembered: dwScope := RESOURCE_REMEMBERED;nsContext: dwScope := RESOURCE_CONTEXT;elsedwScope := RESOURCE_GLOBALNET;end;case FResourceType ofnrAny: dwType := RESOURCETYPE_ANY;nrDisk: dwType := RESOURCETYPE_DISK;nrPrint: dwType := RESOURCETYPE_PRINT;elsedwType := RESOURCETYPE_ANY;end;dwUsage := 0;if nuConnectable in FUsage thendwUsage := dwUsage or RESOURCEUSAGE_CONNECTABLE;if nuContainer in FUsage thendwUsage := dwUsage or RESOURCEUSAGE_CONTAINER;dwResult := WNetOpenEnum(dwScope, dwType, dwUsage, lpnr, hEnum);if dwResult <> NO_ERROR then Exit;GetMem(nrArray, cbBuffer);repeatdwResultEnum := WNetEnumResource(hEnum, cEntries, nrArray, cbBuffer);if dwResultEnum = NO_ERROR thenfor i := 0 to cEntries-1 dobeginNewItem := TNetworkItem.Create;case nrArray[i].dwScope ofRESOURCE_CONNECTED: NewItem.FScope := nsConnected;RESOURCE_GLOBALNET: NewItem.FScope := nsGlobal;RESOURCE_REMEMBERED: NewItem.FScope := nsRemembered;RESOURCE_CONTEXT: NewItem.FScope := nsContext;elseNewItem.FScope := nsGlobal;end;case nrArray[i].dwType ofRESOURCETYPE_ANY: NewItem.FResourceType := nrAny;RESOURCETYPE_DISK: NewItem.FResourceType := nrDisk;RESOURCETYPE_PRINT: NewItem.FResourceType := nrPrint;elseNewItem.FResourceType := nrAny;end;case nrArray[i].dwDisplayType ofRESOURCEDISPLAYTYPE_GENERIC: NewItem.FDisplay := ndGeneric;RESOURCEDISPLAYTYPE_DOMAIN: NewItem.FDisplay := ndDomain;RESOURCEDISPLAYTYPE_SERVER: NewItem.FDisplay := ndServer;RESOURCEDISPLAYTYPE_SHARE: NewItem.FDisplay := ndShare;RESOURCEDISPLAYTYPE_FILE: NewItem.FDisplay := ndFile;RESOURCEDISPLAYTYPE_GROUP: NewItem.FDisplay := ndGroup;RESOURCEDISPLAYTYPE_NETWORK: NewItem.FDisplay := ndNetwork;RESOURCEDISPLAYTYPE_ROOT: NewItem.FDisplay := ndRoot;RESOURCEDISPLAYTYPE_SHAREADMIN: NewItem.FDisplay :=ndShareAdmin;RESOURCEDISPLAYTYPE_DIRECTORY: NewItem.FDisplay :=ndDirectory;RESOURCEDISPLAYTYPE_TREE: NewItem.FDisplay := ndTree;RESOURCEDISPLAYTYPE_NDSCONTAINER: NewItem.FDisplay :=ndNDSContainer;elseNewItem.FDisplay := ndGeneric;end;NewItem.FUsage := [];if nrArray[i].dwUsage and RESOURCEUSAGE_CONNECTABLE <> 0 thenInclude(NewItem.FUsage, nuConnectable);if nrArray[i].dwUsage and RESOURCEUSAGE_CONTAINER <> 0 thenInclude(NewItem.FUsage, nuContainer);NewItem.FLocalName := StrPas(nrArray[i].lpLocalName);NewItem.FRemoteName := StrPas(nrArray[i].lpRemoteName);NewItem.FComment := StrPas(nrArray[i].lpComment);NewItem.FProvider := StrPas(nrArray[i].lpProvider);NetItems.Add(NewItem);// if container, call recursivelyif (nuContainer in NewItem.FUsage) and (FScope <> nsContext) thenEnumerateNet(NewItem.FSubItems, @nrArray[i])end;until dwResultEnum = ERROR_NO_MORE_ITEMS;FreeMem(nrArray);WNetCloseEnum(hEnum);end;procedure TNetworkBrowser.Refresh;beginFItems.Clear;if FActive thenEnumerateNet(FItems, nil);end;procedure TNetworkBrowser.SetActive(Value: Boolean);beginif Value <> FActive thenbeginFActive := Value;Refresh;end;end;procedure TNetworkBrowser.SetScope(Value: TNetScope);beginif Value <> FScope thenbeginFScope := Value;Refresh;end;end;procedure TNetworkBrowser.SetResourceType(Value: TNetResourceType);beginif Value <> FResourceType thenbeginFResourceType := Value;Refresh;end;end;procedure TNetworkBrowser.SetUsage(Value: TNetUsage);beginif Value <> FUsage thenbeginFUsage := Value;Refresh;end;end;procedure TNetworkBrowser.Open;beginActive := True;end;procedure TNetworkBrowser.Close;beginActive := False;end;end.

    最新回复(0)