網路函數大公開 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 網路函數大公開(摘自zsy_good原作,本人作了修改整理) 作者:zsy_good (http://www.tommstudio.com/newclub30/) --------------------------------------------------------------------------------
聲明:本文摘自CSDN論壇上網友zsy_good的原作,經過了tomm的一些整理修改. {=========================================================================
功 能: 網路函數庫
時 間: 2002/10/02
版 本: 1.0
備 注: 沒有事情幹,抄抄寫寫整理了一些網路函數供大家使用。
希望大家能繼續補充
=========================================================================}
unit netFunc; interface
uses
SysUtils
,Windows
,dialogs
,winsock
,Classes
,ComObj
,WinInet
,Variants; //錯誤資訊常量
const
C_Err_GetLocalIp = '獲取本地ip失敗';
C_Err_GetNameByIpAddr = '獲取主機名失敗';
C_Err_GetSQLServerList = '獲取SQLServer伺服器失敗';
C_Err_GetUserResource = '獲取共用資失敗';
C_Err_GetGroupList = '獲取所有工作組失敗';
C_Err_GetGroupUsers = '獲取工作組中所有電腦失敗';
C_Err_GetNetList = '獲取所有網路類型失敗';
C_Err_CheckNet = '網路不通';
C_Err_CheckAttachNet = '未登入網路';
C_Err_InternetConnected ='沒有上網'; C_Txt_CheckNetSuccess = '網路暢通';
C_Txt_CheckAttachNetSuccess = '已登入網路';
C_Txt_InternetConnected ='上網了'; //得到本機的局域網Ip位址
Function GetLocalIp(var LocalIp:string): Boolean;
//通過Ip返回機器名
Function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ;
//獲取網路中SQLServer列表
Function GetSQLServerList(var List: Tstringlist): Boolean;
//獲取網路中的所有網路類型
Function GetNetList(var List: Tstringlist): Boolean;
//獲取網路中的工作組
Function GetGroupList(var List: TStringList): Boolean;
//獲取工作組中所有電腦
Function GetUsers(GroupName: string; var List: TStringList): Boolean;
//獲取網路中的資源
Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;
//映射網路驅動器
Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean;
//檢測網路狀態
Function CheckNet(IpAddr:string): Boolean;
//檢測機器是否登入網路
Function CheckMacAttachNet: Boolean; //判斷Ip協定有沒有安裝 這個函數有問題
Function IsIPInstalled : boolean;
//檢測機器是否上網
Function InternetConnected: Boolean; //關閉網路連接
function NetCloseAll:boolean;
implementation {=================================================================
功 能: 檢測機器是否登入網路
參 數: 無
返回值: 成功: True 失敗: False
備 注:
版 本:
1.0 2002/10/03 09:55:00
=================================================================}
Function CheckMacAttachNet: Boolean;
begin
Result := False;
if GetSystemMetrics(SM_NETWORK) <> 0 then
Result := True;
end; {=================================================================
功 能: 返回本機的局域網Ip位址
參 數: 無
返回值: 成功: True, 並填充LocalIp 失敗: False
備 注:
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
function GetLocalIP(var LocalIp: string): Boolean;
var
HostEnt: PHostEnt;
Ip: string;
addr: pchar;
Buffer: array [0..63] of char;
GInitData: TWSADATA;
begin
Result := False;
try
WSAStartup(2, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt := GetHostByName(buffer);
if HostEnt = nil then Exit;
addr := HostEnt^.h_addr_list^;
ip := Format('%d.%d.%d.%d', [byte(addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
LocalIp := Ip;
Result := True;
finally
WSACleanup;
end;
end; {=================================================================
功 能: 通過Ip返回機器名
參 數:
IpAddr: 想要得到名字的Ip
返回值: 成功: 機器名 失敗: ''
備 注:
inet_addr function converts a string containing an Internet
Protocol dotted address into an in_addr.
版 本:
1.0 2002/10/02 22:09:00
=================================================================}
function GetNameByIPAddr(IPAddr : String;var MacName:String): Boolean;
var
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
begin
Result := False;
if IpAddr = '' then exit;
try
WSAStartup(2, WSAData);
SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
if HostEnt <> nil then
MacName := StrPas(Hostent^.h_name);
Result := True;
finally
WSACleanup;
end;
end; {=================================================================
功 能: 返回網路中SQLServer列表
參 數:
List: 需要填充的List
返回值: 成功: True,並填充List 失敗 False
備 注:
版 本:
1.0 2002/10/02 22:44:00
=================================================================}
Function GetSQLServerList(var List: Tstringlist): boolean;
var
i: integer;
sRetValue: String;
SQLServer: Variant;
ServerList: Variant;
begin
Result := False;
List.Clear;
try
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList := SQLServer.ListAvailableSQLServers;
for i := 1 to Serverlist.Count do
list.Add (Serverlist.item(i));
Result := True;
Finally
SQLServer := NULL;
ServerList := NULL;
end;
end; {=================================================================
功 能: 判斷Ip協定有沒有安裝
參 數: 無
返回值: 成功: True 失敗: False;
備 注: 該函數還有問題
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
Function IsIPInstalled : boolean;
var
WSData: TWSAData;
ProtoEnt: PProtoEnt;
begin
Result := True;
try
if WSAStartup(2,WSData) = 0 then
begin
ProtoEnt := GetProtoByName('IP');
if ProtoEnt = nil then
Result := False
end;
finally
WSACleanup;
end;
end; {=================================================================
功 能: 返回網路中的共用資源
參 數:
IpAddr: 機器Ip
List: 需要填充的List
返回值: 成功: True,並填充List 失敗: False;
備 注:
WNetOpenEnum function starts an enumeration of network
resources or existing connections.
WNetEnumResource function continues a network-resource
enumeration started by the WNetOpenEnum function.
版 本:
1.0 2002/10/03 07:30:00
=================================================================}
Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//網路類型的陣列
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
Begin
Result := False;
List.Clear;
if copy(Ipaddr,0,2) <> '\\' then
IpAddr := '\\' IpAddr; //填充Ip地址資訊
FillChar(NetResource, SizeOf(NetResource), 0);//初始化網路層次資訊
NetResource.lpRemoteName := @IpAddr[1];//指定電腦名稱
//獲取指定電腦的網路資源控制碼
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);
if Res <> NO_ERROR then exit;//執行失敗
while True do//列舉指定工作組的網路資源
begin
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置?8K
GetMem(Buf, BufSize);//申請記憶體,用於獲取工作組資訊
//獲取指定電腦的網路資源名稱
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//資源列舉完畢
if (Res <> NO_ERROR) then Exit;//執行失敗
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do
begin
//獲取指定電腦中的共用資源名稱, 2表示刪除"\\",
//如\\192.168.0.1 => 192.168.0.1
List.Add(Temp^.lpRemoteName 2);
Inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//關閉一次列舉
if Res <> NO_ERROR then exit;//執行失敗
Result := True;
FreeMem(Buf);
End; {=================================================================
功 能: 返回網路中的工作組
參 數:
List: 需要填充的List
返回值: 成功: True,並填充List 失敗: False;
備 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function GetGroupList( var List : TStringList ) : Boolean;
type
TNetResourceArray = ^TNetResource;//網路類型的陣列
Var
NetResource: TNetResource;
Buf: Pointer;
Count,BufSize,Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i,j: SmallInt;
NetworkTypeList: TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//獲取整個網路中的文件資源的控制碼,lphEnum?返回名柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//Raise Exception(Res);//執行失敗
//獲取整個網路中的網路類型資訊
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置?8K
GetMem(Buf, BufSize);//申請記憶體,用於獲取工作組資訊
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//資源列舉完畢 //執行失敗
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//記錄各個網路類型的資訊
begin
NetworkTypeList.Add(p);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum);//關閉一次列舉
if Res <> NO_ERROR then exit;
for j := 0 to NetworkTypeList.Count-1 do //列出各個網路類型中的所有工作組名稱
begin//列出一個網路類型中的所有工作組名稱
NetResource := TNetResource(NetworkTypeList.Items[J]^);//網路類型資訊
//獲取某個網路類型的文件資源的控制碼,NetResource?網路類型資訊,lphEnum?返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then break;//執行失敗
while true do//列舉一個網路類型的所有工作組的資訊
begin
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置?8K
GetMem(Buf, BufSize);//申請記憶體,用於獲取工作組資訊
//獲取一個網路類型的文件資源資訊,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//資源列舉完畢 //執行失敗
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列舉各個工作組的資訊
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一個工作組的名稱
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum);//關閉一次列舉
if Res <> NO_ERROR then break;//執行失敗
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End; {=================================================================
功 能: 列舉工作組中所有的電腦
參 數:
List: 需要填充的List
返回值: 成功: True,並填充List 失敗: False;
備 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function GetUsers(GroupName: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//網路類型的陣列
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0);//初始化網路層次資訊
NetResource.lpRemoteName := @GroupName[1];//指定工作組名稱
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//類型?伺服器(工作組)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
NetResource.dwScope := RESOURCETYPE_DISK;//列舉文件資源資訊
//獲取指定工作組的網路資源控制碼
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then Exit; //執行失敗
while True do//列舉指定工作組的網路資源
begin
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置?8K
GetMem(Buf, BufSize);//申請記憶體,用於獲取工作組資訊
//獲取電腦名稱
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//資源列舉完畢
if (Res <> NO_ERROR) then Exit;//執行失敗
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列舉工作組的電腦名稱
begin
//獲取工作組的電腦名稱, 2表示刪除"\\",如\\wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName 2);
inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//關閉一次列舉
if Res <> NO_ERROR then exit;//執行失敗
Result := True;
FreeMem(Buf);
end; {=================================================================
功 能: 列舉所有網路類型
參 數:
List: 需要填充的List
返回值: 成功: True,並填充List 失敗: False;
備 注:
版 本:
1.0 2002/10/03 08:54:00
=================================================================}
Function GetNetList(var List: Tstringlist): Boolean;
type
TNetResourceArray = ^TNetResource;//網路類型的陣列
Var
p: TNetResourceArray;
Buf: Pointer;
i: SmallInt;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWORD;
begin
Result := False;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//執行失敗
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置?8K
GetMem(Buf, BufSize);//申請記憶體,用於獲取工作組資訊
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//獲取網路類型資訊
//資源列舉完畢 //執行失敗
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//記錄各個網路類型的資訊
begin
List.Add(p^.lpRemoteName);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum); //關閉一次列舉
if Res <> NO_ERROR then exit; //執行失敗
Result := True;
FreeMem(Buf); //釋放記憶體
end; {=================================================================
功 能: 映射網路驅動器
參 數:
NetPath: 想要映射的網路路徑
Password: 訪問密碼
Localpath 本地路徑
返回值: 成功: True 失敗: False;
備 注:
版 本:
1.0 2002/10/03 09:24:00
=================================================================}
Function NetAddConnection(NetPath: Pchar; PassWord: Pchar
;LocalPath: Pchar): Boolean;
var
Res: Dword;
begin
Result := False;
Res := WNetAddConnection(NetPath,Password,LocalPath);
if Res <> No_Error then exit;
Result := True;
end; {=================================================================
功 能: 檢測網路狀態
參 數:
IpAddr: 被測試網路上主機的IP地址或名稱,建議使用Ip
返回值: 成功: True 失敗: False;
備 注:
版 本:
1.0 2002/10/03 09:40:00
=================================================================}
Function CheckNet(IpAddr: string): Boolean;
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte; // Time To Live (used for traceroute)
TOS: Byte; // Type Of Service (usually 0)
Flags: Byte; // IP header flags (usually 0)
OptionsSize: Byte; // Size of options data (usually 0, max 40)
OptionsData: PChar; // Options data buffer
end; PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWord; // replying address
Status: DWord; // IP status value (see below)
RTT: DWord; // Round Trip Time in milliseconds
DataSize: Word; // reply data size
Reserved: Word;
Data: Pointer; // pointer to reply data buffer
Options: TIPOptionInformation; // reply options
end; TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
TIcmpSendEcho = function(
IcmpHandle: THandle;
DestinationAddress: DWord;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall; const
Size = 32;
TimeOut = 1000;
var
wsadata: TWSAData;
Address: DWord; // Address of host to contact
HostName, HostIP: String; // Name and dotted IP of host to contact
Phe: PHostEnt; // HostEntry buffer for name lookup
BufferSize, nPkts: Integer;
pReqData, pData: Pointer;
pIPE: PIcmpEchoReply; // ICMP Echo reply buffer
IPOpt: TIPOptionInformation; // IP Options for packet to send
const
IcmpDLL = 'icmp.dll';
var
hICMPlib: HModule;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
hICMP: THandle; // Handle for the ICMP Calls
begin
// initialise winsock
Result:=True;
if WSAStartup(2,wsadata) <> 0 then begin
Result:=False;
halt;
end;
// register the icmp.dll stuff
hICMPlib := loadlibrary(icmpDLL);
if hICMPlib <> null then begin
@ICMPCreateFile := GetProcAddress(hICMPlib, 'IcmpCreateFile');
@IcmpCloseHandle:= GetProcAddress(hICMPlib, 'IcmpCloseHandle');
@IcmpSendEcho:= GetProcAddress(hICMPlib, 'IcmpSendEcho');
if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then begin
Result:=False;
halt;
end;
hICMP := IcmpCreateFile;
if hICMP = INVALID_HANDLE_VALUE then begin
Result:=False;
halt;
end;
end else begin
Result:=False;
halt;
end;
// ------------------------------------------------------------
Address := inet_addr(PChar(IpAddr));
if (Address = INADDR_NONE) then begin
Phe := GetHostByName(PChar(IpAddr));
if Phe = Nil then Result:=False
else begin
Address := longint(plongint(Phe^.h_addr_list^)^);
HostName := Phe^.h_name;
HostIP := StrPas(inet_ntoa(TInAddr(Address)));
end;
end
else begin
Phe := GetHostByAddr(@Address, 4, PF_INET);
if Phe = Nil then Result:=False;
end; if Address = INADDR_NONE then
begin
Result:=False;
end;
// Get some data buffer space and put something in the packet to send
BufferSize := SizeOf(TICMPEchoReply) Size;
GetMem(pReqData, Size);
GetMem(pData, Size);
GetMem(pIPE, BufferSize);
FillChar(pReqData^, Size, $AA);
pIPE^.Data := pData; // Finally Send the packet
FillChar(IPOpt, SizeOf(IPOpt), 0);
IPOpt.TTL := 64;
NPkts := IcmpSendEcho(hICMP, Address, pReqData, Size,
@IPOpt, pIPE, BufferSize, TimeOut);
if NPkts = 0 then Result:=False; // Free those buffers
FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData); // --------------------------------------------------------------
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPlib);
// free winsock
if WSACleanup <> 0 then Result:=False;
end; {=================================================================
功 能: 檢測電腦是否上網
參 數: 無
返回值: 成功: True 失敗: False;
備 注: uses Wininet
版 本:
1.0 2002/10/07 13:33:00
=================================================================}
function InternetConnected: Boolean;
const
// local system uses a modem to connect to the Internet.
INTERNET_CONNECTION_MODEM = 1;
// local system uses a local area network to connect to the Internet.
INTERNET_CONNECTION_LAN = 2;
// local system uses a proxy server to connect to the Internet.
INTERNET_CONNECTION_PROXY = 4;
// local system's modem is busy with a non-Internet connection.
INTERNET_CONNECTION_MODEM_BUSY = 8;
var
dwConnectionTypes : DWORD;
begin
dwConnectionTypes := INTERNET_CONNECTION_MODEM INTERNET_CONNECTION_LAN
INTERNET_CONNECTION_PROXY;
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end; //關閉網路連接
function NetCloseAll:boolean;
const
NETBUFF_SIZE=$208;
type
NET_API_STATUS=DWORD;
LPByte=PByte;
var
dwNetRet :DWORD;
i :integer;
dwEntries :DWORD;
dwTotalEntries :DWORD;
szClient :LPWSTR;
dwUserName :DWORD;
Buff :array[0..NETBUFF_SIZE-1]of byte;
Adword :array[0..NETBUFF_SIZE div 4-1] of dword;
NetSessionEnum:function ( ServerName:LPSTR;
Reserved:DWORD;
Buf:LPByte;
BufLen:DWORD;
ConnectionCount:LPDWORD;
ConnectionToltalCount:LPDWORD ):NET_API_STATUS;
stdcall; NetSessionDel:function ( ServerName:LPWSTR;
UncClientName: LPWSTR ;
UserName: dword):NET_API_STATUS;
stdcall;
LibHandle : THandle;
begin
Result:=false;
try
{ 載入 DLL }
LibHandle := LoadLibrary('svrapi.dll');
try
{ 如果載入失敗,LibHandle = 0.}
if LibHandle = 0 then
raise Exception.Create('不能載入SVRAPI.DLL');
{ DLL 載入成功,取得到 DLL 輸出函數的連接然後調用 }
@NetSessionEnum := GetProcAddress(LibHandle, 'NetSessionEnum');
@NetSessionDel := GetProcAddress(LibHandle, 'NetSessionDel'); if (@NetSessionEnum = nil)or(@NetSessionDel=nil) then
RaiseLastWin32Error { 連接函數失敗 }
else
begin
dwNetRet := NetSessionEnum( nil,$32, @Buff,
NETBUFF_SIZE, @dwEntries,
@dwTotalEntries );
if dwNetRet = 0 then
begin
Result := true;
for i:=0 to dwTotalEntries-1 do
begin
Move(Buff,Adword,NETBUFF_SIZE);
szClient:=LPWSTR(Adword[0]);
dwUserName := Adword[2];
dwNetRet := NetSessionDel( nil,szClient,dwUserName);
if( dwNetRet <> 0 ) then
begin
Result := false;
break;
end;
Move(Buff[26],Buff[0],NETBUFF_SIZE-(i 1)*26);
end
end
else
Result := false;
end;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
except
end;
end; end. 這個unit的下載在本站原碼天地. *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |