说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

DELPHI 和 THE INTERNET

HTML文档下载 WORD文档下载 PDF文档下载
DELPHI 和 THE INTERNET

FTP 使用 WININET

现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样,

这个部分与第一部分完全无关。

让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了

解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件

事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量:

var

HINTERNET: Pointer;

这个指针扮演一个您正在使用的不同的因特网服务的句柄的角色。获得了这个句柄之

后,你应当把它作为第一个参数传递给在这个进程周期[注:指FTP的整个存在时间(译者

)]中调用的其他WININET函数。

您要记住的适当您在使用它的时间内要把句柄返回给系统,通常是通过调用

WININET 函数 InternetCloseHandle 来实现:

function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;

为了让一个WININET进程开始,您调用 InternetOpen :

function InternetOpen(lpszCallerName: PChar; dwAccessType: DWORD;

lpszServerName: PChar; nServerPort: INTERNET_PORT;

dwFlags: DWORD): HINTERNET; stdcall;

第一个参数时打开这个进程的应用程序的名字。您可以在这个参数中传递任何您所要

的任意符串。微软公司的文献声称"这个名字作为HTTP协议中的用户代理器的名字而被使

用"。这个保留的参数可以设为0或空。

var

MyHandle: HINTERNET;

begin

MyHandle := InternetOpen('MyApp'

0

nil

0

0);

end;

如果您想要关于这个函数的更多信息,从 www.microsoft.com 那里下载

WININET.HLP 。

打开了这这个进程之后,下一步是通过 InternetConnect 函数来连接到服务器上。

function InternetConnect(

hInet: HINTERNET; // Handle from InternetOpen

lpszServerName: PChar; // Server: i.e.

www.borland.com

nServerPort: INTERNET_PORT; // Usually 0

lpszUsername: PChar; // usually anonymous

lpszPassword: PChar; // usually your email address

dwService: DWORD; // FTP

HTTP

or Gopher?

dwFlags: DWORD; // Usually 0

dwContext: DWORD): // User defined number for callback

HINTERNET; stdcall;

这里有三个可能的可以通过 dwService 参数传递的自说明旗标,它们是互斥的:

INTERNET_SERVICE_FTP

INTERNET_SERVICE_GOPHER

INTERNET_SERVICE_HTTP

下面是 dwFlags 参数的选择:

INTERNET_CONNECT_FLAG_PASSIVE

这个选项仅当您在前一个参数中传递了 INTERNET_SERVER_FTP 才有效。这时候这个

参数没有其他有效的选项。

如果这个进程成功的话会返回一个有效的指针,否则它返回空。

连接上之后

当您连接上之后,您可以调用来 GetCurrentDirectory 获得当前的路径的名字:

function TMyFtp.GetCurrentDirectory: string;

var

Len: Integer;

S: string;

begin

Len := 0;

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

SetLength(S

Len);

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

Result := S;

end;

这个函数声明如下:

function FtpGetCurrentDirectory(

hFtpSession: HINTERNET; // handle from InternetConnect

lpszCurrentDirectory: PChar; // directory returned here

var lpdwCurrentDirectory: DWORD): // buf size of 2nd parameter

BOOL; stdcall; // True on success

如果您把最后一个参数设为0,那么WININET会使用这个参数来返回路径字符串的长度

。接着您可以为您的字符串分配内存,也可以在调用一次这个函数来获得路径的名字。这

个过程在上面的方法中已经演示过了。(注意到*设定长度*的那个调用,Delphi

要求您在类似这样的情况下为新的长字符串分配内存!这是因为这个字符串必须在操作系

统中指定值,而不是在 Delphi 应用程序中指定。结果就是 Delphi 不能在类似的情况下

像它通常那样悄悄地为字符串分配内存)

下面是返回在特定路径下当前可用的文件的一系列函数:

function GetFindDataStr(FindData: TWin32FindData): string;

var

S: string;

Temp: string;

begin

case FindData.dwFileAttributes of

FILE_ATTRIBUTE_ARCHIVE: S := 'A';

// FILE_ATTRIBUTE_COMPRESSED: S := 'C';

FILE_ATTRIBUTE_DIRECTORY: S := 'D';

FILE_ATTRIBUTE_HIDDEN: S := 'H';

FILE_ATTRIBUTE_NORMAL: S := 'N';

FILE_ATTRIBUTE_READONLY: S := 'R';

FILE_ATTRIBUTE_SYSTEM: S := 'S';

FILE_ATTRIBUTE_TEMPORARY: S := 'T';

else

S := IntToStr(FindData.dwFileAttributes);

end;

S := S + GetDots(75);

Move(FindData.CFilename[0]

S[6]

StrLen(FindData.CFileName));

Temp := IntToStr(FindData.nFileSizeLow);

Move(Temp[1]

S[25]

Length(Temp));

Result := S;

end;

function TMyFtp.FindFiles: TStringList;

var

FindData: TWin32FindData;

FindHandle: HInternet;

begin

FindHandle := FtpFindFirstFile(FFtphandle

'*.*'

FindData

0

0);

if FindHandle = nil then begin

Result := nil;

Exit;

end;

FCurFiles.Clear;

FCurFiles.Add(GetFindDataStr(FindData));

while InternetFindnextFile(FindHandle

@FindData) do

FCurFiles.Add(GetFindDataStr(FindData));

InternetCloseHandle(Findhandle);

GetCurrentDirectory;

Result := FCurFiles;

end;

这里需要注意的关键函数是 ftpFindFirstFile

InternetFindNextFile &

InternetCloseHandle 。您可以像调用 Delphi 函数 FindFirst、FindNext & FinClose

一样调用这些函数。特别的是,您使用函数 ftpFindFirstFile 来取得这个路径下的第一

个函数。您可以不断地调用

InternetFindNextFile ,直到函数返回"False"为止。当这个进程结束时,调用

InternetCloseHandle 来通知操作系统回收与这个进程相关的内存。

我不准备在这里进一步解析这个进程。如果您想要更多的信息,您可以在 Delphi

帮助中查找 FindFirst 。最后提醒一句:并不向前文提及的函数,TWin32FindData 并不

是在 WININET.PAS 中定义的, 但可以在随 Delphi 分发的 WIN32 帮助文件中找到它。

它在随 Delphi

分发的 WINDOWS.PAS 文件中被定义。

FTP 使用 WININET

现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样,

这个部分与第一部分完全无关。

让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了

解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件

事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量:

var

HINTERNET: Pointer;

这个指针扮演一个您正在使用的不同的因特网服务的句柄的角色。获得了这个句柄之

后,你应当把它作为第一个参数传递给在这个进程周期[注:指FTP的整个存在时间(译者

)]中调用的其他WININET函数。

您要记住的适当您在使用它的时间内要把句柄返回给系统,通常是通过调用

WININET 函数 InternetCloseHandle 来实现:

function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;

为了让一个WININET进程开始,您调用 InternetOpen :

function InternetOpen(lpszCallerName: PChar; dwAccessType: DWORD;

lpszServerName: PChar; nServerPort: INTERNET_PORT;

dwFlags: DWORD): HINTERNET; stdcall;

第一个参数时打开这个进程的应用程序的名字。您可以在这个参数中传递任何您所要

的任意符串。微软公司的文献声称"这个名字作为HTTP协议中的用户代理器的名字而被使

用"。这个保留的参数可以设为0或空。

var

MyHandle: HINTERNET;

begin

MyHandle := InternetOpen('MyApp'

0

nil

0

0);

end;

如果您想要关于这个函数的更多信息,从 www.microsoft.com 那里下载

WININET.HLP 。

打开了这这个进程之后,下一步是通过 InternetConnect 函数来连接到服务器上。

function InternetConnect(

hInet: HINTERNET; // Handle from InternetOpen

lpszServerName: PChar; // Server: i.e.

www.borland.com

nServerPort: INTERNET_PORT; // Usually 0

lpszUsername: PChar; // usually anonymous

lpszPassword: PChar; // usually your email address

dwService: DWORD; // FTP

HTTP

or Gopher?

dwFlags: DWORD; // Usually 0

dwContext: DWORD): // User defined number for callback

HINTERNET; stdcall;

这里有三个可能的可以通过 dwService 参数传递的自说明旗标,它们是互斥的:

INTERNET_SERVICE_FTP

INTERNET_SERVICE_GOPHER

INTERNET_SERVICE_HTTP

下面是 dwFlags 参数的选择:

INTERNET_CONNECT_FLAG_PASSIVE

这个选项仅当您在前一个参数中传递了 INTERNET_SERVER_FTP 才有效。这时候这个

参数没有其他有效的选项。

如果这个进程成功的话会返回一个有效的指针,否则它返回空。

连接上之后

当您连接上之后,您可以调用来 GetCurrentDirectory 获得当前的路径的名字:

function TMyFtp.GetCurrentDirectory: string;

var

Len: Integer;

S: string;

begin

Len := 0;

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

SetLength(S

Len);

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

Result := S;

end;

这个函数声明如下:

function FtpGetCurrentDirectory(

hFtpSession: HINTERNET; // handle from InternetConnect

lpszCurrentDirectory: PChar; // directory returned here

var lpdwCurrentDirectory: DWORD): // buf size of 2nd parameter

BOOL; stdcall; // True on success

如果您把最后一个参数设为0,那么WININET会使用这个参数来返回路径字符串的长度

。接着您可以为您的字符串分配内存,也可以在调用一次这个函数来获得路径的名字。这

个过程在上面的方法中已经演示过了。(注意到*设定长度*的那个调用,Delphi

要求您在类似这样的情况下为新的长字符串分配内存!这是因为这个字符串必须在操作系

统中指定值,而不是在 Delphi 应用程序中指定。结果就是 Delphi 不能在类似的情况下

像它通常那样悄悄地为字符串分配内存)

下面是返回在特定路径下当前可用的文件的一系列函数:

function GetFindDataStr(FindData: TWin32FindData): string;

var

S: string;

Temp: string;

begin

case FindData.dwFileAttributes of

FILE_ATTRIBUTE_ARCHIVE: S := 'A';

// FILE_ATTRIBUTE_COMPRESSED: S := 'C';

FILE_ATTRIBUTE_DIRECTORY: S := 'D';

FILE_ATTRIBUTE_HIDDEN: S := 'H';

FILE_ATTRIBUTE_NORMAL: S := 'N';

FILE_ATTRIBUTE_READONLY: S := 'R';

FILE_ATTRIBUTE_SYSTEM: S := 'S';

FILE_ATTRIBUTE_TEMPORARY: S := 'T';

else

S := IntToStr(FindData.dwFileAttributes);

end;

S := S + GetDots(75);

Move(FindData.CFilename[0]

S[6]

StrLen(FindData.CFileName));

Temp := IntToStr(FindData.nFileSizeLow);

Move(Temp[1]

S[25]

Length(Temp));

Result := S;

end;

function TMyFtp.FindFiles: TStringList;

var

FindData: TWin32FindData;

FindHandle: HInternet;

begin

FindHandle := FtpFindFirstFile(FFtphandle

'*.*'

FindData

0

0);

if FindHandle = nil then begin

Result := nil;

Exit;

end;

FCurFiles.Clear;

FCurFiles.Add(GetFindDataStr(FindData));

while InternetFindnextFile(FindHandle

@FindData) do

FCurFiles.Add(GetFindDataStr(FindData));

InternetCloseHandle(Findhandle);

GetCurrentDirectory;

Result := FCurFiles;

end;

这里需要注意的关键函数是 ftpFindFirstFile

InternetFindNextFile &

InternetCloseHandle 。您可以像调用 Delphi 函数 FindFirst、FindNext & FinClose

一样调用这些函数。特别的是,您使用函数 ftpFindFirstFile 来取得这个路径下的第一

个函数。您可以不断地调用

InternetFindNextFile ,直到函数返回"False"为止。当这个进程结束时,调用

InternetCloseHandle 来通知操作系统回收与这个进程相关的内存。

I'm not going to explain this process further in this newsletter. If you want

more information

you might look up FindFirst in the Delphi help. One final

note: Unlike the functions mentioned in the previous paragraph

TWin32FindData is not defined in

WININET.PAS

but instead can be found in the WIN32 help file that ships with

Delphi. It is declared in the WINDOWS.PAS file that ships with Delphi.

我不准备在这里进一步解析这个进程。如果您想要更多的信息,您可以在 Delphi

帮助中查找 FindFirst 。最后提醒一句:并不向前文提及的函数,TWin32FindData 并不

是在 WININET.PAS 中定义的, 但可以在随 Delphi 分发的 WIN32 帮助文件中找到它。

它在随 Delphi

分发的 WINDOWS.PAS 文件中被定义。

==============================================================================

====

接受一个文件

您可以使用 WININET.PAS 文件中的 ftpGetFile 函数来从FTP取回一个文件:

function FtpGetFile(

hFtpSession: HINTERNET; // Returned by InternetConnect

lpszRemoteFile: PChar; // File to get

lpszNewFile: PChar; // Where to put it on your PC

fFailIfExists: BOOL; // Overwrite existing files?

dwFlagsAndAttributes: DWORD; // File attribute-See CreateFile.

dwFlags: DWORD; // Binary or ASCII transfer

dwContext: DWORD): // Usually zero

BOOL stdcall; // True on success

下面是一个如何使用该函数的例子:

function TMyFtp.GetFile(FTPFile

NewFile: string): Boolean;

begin

Result := FtpGetFile(FFTPHandle

PChar(FTPFile)

PChar(NewFile)

False

File_Attribute_Normal

Ftp_Transfer_Type_Binary

0);

end;

如果要知道 dwFlagsAndAttributes 参数中的变量是怎样传递的,请查阅随 Delphi

附送的 WIN32 帮助文件。

典型控制

下面的 Delphi 控制给了你一个通过 WININET FTP 部分建立可视工具的起点。只是因

为,这个控制可以让您是用 Object Inspector 来定义远程服务器(RemoteServer)、用户

身份(UserID)和密码(Password)。

unit Ftp1;

{ FTP example using WININET.PAS rather than

an ACTIVEX control. Requires WININET.PAS and

WININET.DLL. WININET.DLL you can get from

Microsoft

WININET.PAS is available from

www.borland.com

or with some versions of

Delphi 2.0.

You might Respond to OnNewDir events as follows:

procedure TForm1.FTP1NewDir(Sender: TObject);

begin

ListBox1.Items := MyFtp1.FindFiles; // Get the directory list

end;

}

interface

uses

Windows

Classes

WinINet

SysUtils;

type

TMyFtp = class(TComponent)

private

FContext: Integer;

FINet: HInternet;

FFtpHandle: HInternet;

FCurFiles: TStringList;

FServer: string;

FOnNewDir: TNotifyEvent;

FCurDir: string;

FUserID: string;

FPassword: string;

function GetCurrentDirectory: string;

procedure SetUpNewDir;

protected

destructor Destroy; override;

public

constructor Create(AOwner: TComponent); override;

function Connect: Boolean;

function FindFiles: TStringList;

function ChangeDirExact(S: string): Boolean;

function ChangeDirCustom(S: string): Boolean;

function BackOneDir: Boolean;

function GetFile(FTPFile

NewFile: string): Boolean;

function SendFile1(FTPFile

NewFile: string): Boolean;

function SendFile2(FTPFile

NewFile: string): Boolean;

function CustomToFileName(S: string): string;

published

property CurFiles: TStringList read FCurFiles;

property CurDir: string read FCurDir;

property UserID: string read FUserID write FUserID;

property Password: string read FPassword write FPassword;

property Server: string read FServer write FServer;

property OnNewDir: TNotifyEvent read FOnNewDir

write FOnNewDir;

end;

procedure Register;

implementation

uses

Dialogs;

// A few utility functions

function GetFirstToken(S: string; Token: Char): string;

var

Temp: string;

Index: INteger;

begin

Index := Pos(Token

S);

if Index < 1 then begin

GetFirstToken := '';

Exit;

end;

Dec(Index);

SetLength(Temp

Index);

Move(S[1]

Temp[1]

Index);

GetFirstToken := Temp;

end;

function StripFirstToken(S: string; Ch: Char): string;

var

i

Size: Integer;

begin

i := Pos(Ch

S);

if i = 0 then begin

StripFirstToken := S;

Exit;

end;

Size := (Length(S) - i);

Move(S[i + 1]

S[1]

Size);

SetLength(S

Size);

StripFirstToken := S;

end;

function ReverseStr(S: string): string;

var

Len: Integer;

Temp: String;

i

j: Integer;

begin

Len := Length(S);

SetLength(Temp

Len);

j := Len;

for i := 1 to Len do begin

Temp[i] := S[j];

dec(j);

end;

ReverseStr := Temp;

end;

function StripLastToken(S: string; Token: Char): string;

var

Temp: string;

Index: INteger;

begin

SetLength(Temp

Length(S));

S := ReverseStr(S);

Index := Pos(Token

S);

Inc(Index);

Move(S[Index]

Temp[1]

Length(S) - (Index - 1));

SetLength(Temp

Length(S) - (Index - 1));

StripLastToken := ReverseStr(Temp);

end;

procedure Register;

begin

RegisterComponents('Unleash'

[TMyFtp]);

end;

constructor TMyFtp.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

FCurFiles := TStringList.Create;

FINet := InternetOpen('WinINet1'

0

nil

0

0);

end;

destructor TMyFtp.Destroy;

begin

if FINet <> nil then

InternetCloseHandle(FINet);

if FFtpHandle <> nil then

InternetCloseHandle(FFtpHandle);

inherited Destroy;

end;

function TMyFtp.Connect: Boolean;

begin

FContext := 255;

FftpHandle := InternetConnect(FINet

PChar(FServer)

0

PChar(FUserID)

PChar(FPassWord)

Internet_Service_Ftp

0

FContext);

if FFtpHandle = nil then

Result := False

else begin

SetUpNewDir;

Result := True;

end;

end;

function TMyFtp.GetCurrentDirectory: string;

var

Len: Integer;

S: string;

begin

Len := 0;

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

SetLength(S

Len);

ftpGetCurrentDirectory(FFTPHandle

PChar(S)

Len);

Result := S;

end;

procedure TMyFtp.SetUpNewDir;

begin

FCurDir := GetCurrentDirectory;

if Assigned(FOnNewDir) then

FOnNewDir(Self);

end;

function GetDots(NumDots: Integer): string;

var

S: string;

i: Integer;

begin

S := '';

for i := 1 to NumDots do

S := S + ' ';

Result := S;

end;

function GetFindDataStr(FindData: TWin32FindData): string;

var

S: string;

Temp: string;

begin

case FindData.dwFileAttributes of

FILE_ATTRIBUTE_ARCHIVE: S := 'A';

// FILE_ATTRIBUTE_COMPRESSED: S := 'C';

FILE_ATTRIBUTE_DIRECTORY: S := 'D';

FILE_ATTRIBUTE_HIDDEN: S := 'H';

FILE_ATTRIBUTE_NORMAL: S := 'N';

FILE_ATTRIBUTE_READONLY: S := 'R';

FILE_ATTRIBUTE_SYSTEM: S := 'S';

FILE_ATTRIBUTE_TEMPORARY: S := 'T';

else

S := IntToStr(FindData.dwFileAttributes);

end;

S := S + GetDots(75);

Move(FindData.CFilename[0]

S[6]

StrLen(FindData.CFileName));

Temp := IntToStr(FindData.nFileSizeLow);

Move(Temp[1]

S[25]

Length(Temp));

Result := S;

end;

function TMyFtp.FindFiles: TStringList;

var

FindData: TWin32FindData;

FindHandle: HInternet;

begin

FindHandle := FtpFindFirstFile(FFtphandle

'*.*'

FindData

0

0);

if FindHandle = nil then begin

Result := nil;

Exit;

end;

FCurFiles.Clear;

FCurFiles.Add(GetFindDataStr(FindData));

while InternetFindnextFile(FindHandle

@FindData) do

FCurFiles.Add(GetFindDataStr(FindData));

InternetCloseHandle(Findhandle);

GetCurrentDirectory;

Result := FCurFiles;

end;

function TMyFtp.CustomToFileName(S: string): string;

const

PreSize = 6;

var

Temp: string;

TempSize: Integer;

begin

Temp := '';

TempSize := Length(S) - PreSize;

SetLength(Temp

TempSize);

Move(S[PreSize]

Temp[1]

TempSize);

Temp := GetFirstToken(Temp

' ');

Result := Temp;

end;

function TMyFtp.BackOneDir: Boolean;

var

S: string;

begin

S := FCurDir;

S := StripLastToken(S

'/');

if S = '/' then begin

Result := False;

Exit;

end;

if S <> '' then begin

ChangeDirExact(S);

Result := True;

end else begin

ChangeDirExact('/');

Result := True;

end;

end;

// Changes to specific directory in S

function TMyFtp.ChangeDirExact(S: string): Boolean;

begin

if S <> '' then

FtpSetCurrentDirectory(FFTPHandle

PChar(S));

Result := True;

FindFiles;

SetUpNewDir;

end;

// Assumes S has been returned by GetFindDataString;

function TMyFtp.ChangeDirCustom(S: string): Boolean;

begin

S := CustomToFileName(S);

if S <> '' then

FtpSetCurrentDirectory(FFTPHandle

PChar(S));

Result := True;

FindFiles;

SetUpNewDir;

end;

function TMyFtp.GetFile(FTPFile

NewFile: string): Boolean;

begin

Result := FtpGetFile(FFTPHandle

PChar(FTPFile)

PChar(NewFile)

False

File_Attribute_Normal

Ftp_Transfer_Type_Binary

0);

end;

function TMyFtp.SendFile1(FTPFile

NewFile: string): Boolean;

const

Size:DWord = 3000;

var

Transfer: Bool;

Error: DWord;

S: string;

begin

Transfer := FtpPutFile(FFTPHandle

PChar(FTPFile)

PChar(NewFile)

Ftp_Transfer_Type_Binary

0);

if not Transfer then begin

Error := GetLastError;

ShowMessage(Format('Error Number: %d. Hex: %x'

[Error

Error]));

SetLength(S

Size);

if not InternetGetLastResponseInfo(Error

PChar(S)

Size) then

begin

Error := GetLastError;

ShowMessage(Format('Error Number: %d. Hex: %x'

[Error

Error]));

end;

ShowMessage(Format('Error Number: %d. Hex: %x Info: %s'

[Error

Error

S]));

end else

ShowMessage('Success');

Result := Transfer;

end;

function TMyFtp.SendFile2(FTPFile

NewFile: string): Boolean;

var

FHandle: HInternet;

begin

FHandle := FtpOpenFile(FFTPHandle

'sam.txt'

GENERIC_READ

FTP_TRANSFER_TYPE_BINARY

0);

if FHandle <> nil then

InternetCloseHandle(FHandle)

else

ShowMessage('Failed');

Result := True;

end;

end.

C#从Web网站下载文件 C#得到区域名称列表 C#合并多个PrintDocument WpWidgetLibrary - Windows Phone的HTML部件库(Widgets) 让你不再害怕C语言指针 C语言概述-C语言教程 Turbo C 2.0集成开发环境的使用(上)-C语言教程 Turbo C 2.0集成开发环境的使用(下)-C语言教程 程序的灵魂—算法-C语言教程 数据类型、运算符与表达式(上)-C语言教程 数据类型、运算符与表达式(下)-C语言教程 最简单的C语言顺序程序设计-C语言教程 分支结构程序-C语言教程 循环控制-C语言教程 数值数组-C语言教程 字符数组-C语言教程 函数(上)-C语言教程 函数(下)-C语言教程 预处理命令-C语言教程 C语言指针(上)-C语言教程 C语言指针(下)-C语言教程 结构体与共用体-C语言教程 位运算-C语言教程 文件处理-C语言教程 谭浩强C语言教程 C语言创建链表并实现插入、删除数据 C语言中队列Queue的操作 C语言实现堆栈stack操作 C语言建立和遍历二叉树 C语言冒泡排序法演示代码 C语言实现堆排序(Heap Sort) 新開一貼,sql語句請教,急,給分!!! 局域网内指定IP出现“该静态IP地址已经使用”,原理如何,如何编程实现。 一个语句的写法,up者有分 关于数据汇总的精典SQL语句求教! 有奖捉疵 50分 怎么打*****号部分的代码总不执行啊? 请问如何列举当前打印机支持的纸张信息? 歌词和音乐同步问题?winnap的歌词插件基于什么样的原理做出来? 急救!!!关于对话框中编辑框重画问题 小问题。。。。只想知道为什么。。。。 转载(贫富悬殊的中国) !!!用ASP能否实现一次上传一整个目录下所有的文件(子目录不算)?高手请答复! TreeView专题讨论 j2me中请问如果将textField中的内容写入到moto388手机的记事本中? 在vc中调用其他的exe include 另外一个jsp文件时,能向那个文件传参数吗?不能的话,有其他办法吗?谢谢 系统不能识别DaysBetween,如何处理 请问如下通过web连续下载图片,只是第一张要提示,以后每张就不再提示了? 关于ADO驱动MDAC版本的疑问 兄弟要工作了,是不是只要见到领导都要打次招呼? 我的问题!! 最近在用MFC写GDI程序,请前辈们给点建议 老兄给一些建议啊!用VB做什么毕业设计比较合适啊? 急,获取主板信息的问题! 请教finder的排序问题 mysql对一个数据库中表的数量有没有限制? 100分,急求控件的编写方法~!!!!我在做的项目想用到类似于vc编译器左边的class,resource,file view的窗口控件,谁有? 为什么我收到的邮件列表每次都是乱码?怎样打开? 大家帮看看这段代码哪出问题了,在线给分 求高效统计算法(在线等待,采纳着需要分来信200) 怎样将bcb中vcl 及其他组件改为activex??? 微软的面试题 treeview 控件在客户端的操作? 怎样在程序里找无标题的DLG! j2me中请问如果将textField中的内容写入到moto388手机的记事本中? 谁可以和我说一下LINUX是如配置的! 请问:如何在java通过xml文件和他的schema,既得到标签里的内容,有能够知道内容的类型 已修改的列 C++Test讨论区 菜鸟提问,大家不要笑我啊! 这里还有人在用Java IDE工具JawaBeginer的吗? 有谁知道aspopup控件的功能和作用--在线等待 100分,急求控件的编写方法~!!!!我在做的项目想用到类似于vc编译器左边的class,resource,file view的窗口控件,谁有? 简单的菜鸟问题!! 如何写WPE这种类型的软件? 向DX请教两个开发上的问题,请不吝赐教! java中字符串数组,转化为javascript数组,jsp页面显示为乱码,代码如下: 小问题一个 有关QuickStart中示例 求SQL语句,一表值通过另一表更新 关于activebar 2。0 请问哪个中译英的免费软件好一点啊? 大虾救命:TCP编程的客户端端口占用问题 侵入岩不是在地下冷凝结晶而形成的岩石吗?华山,衡山,黄山,普陀山都是侵入岩,但是它们都怎么在地表上 下面一幅图中的最后一行的最后两个硬币图案是哪个国家的硬币啊 请问大家高锰酸钾水溶液烧开了后,其中的高锰酸钾会随着水蒸汽消耗分解么? 为什么利马是秘鲁的首都 一个凸多边形共有20条对角线,它是几边形?是否存在有18条对角线的多边形?如果存在,它是几边形?如果不存在,说明得出结论的道理 有增加身体高度的方法吗`~?~ 秘鲁为什么选择在热带沙漠中定都(利马) 旁通阀装在什么位置?起什么作用? 求多边形对角线公式 华山的岩石种类 请问发动机润滑系统的限压阀和旁通阀各起什么作用? 胸腺五肽是什么药,可以增强人体免疫功能吗? 怎样割划玻璃 已知函数单调性,求参数范围若f(X)=4x+ax∧2-(2╱3)x∧3在R上总是减函数,求a的取值范围 日记帐在本月合计时,是在数字下面画单红线还是在本月合计下面划单红线 如何在频段不同发送无线电波比如2.4Ghz,我知道这是一个频段,那2.4Ghz对于实际电路上应该怎么理解,对应这个频率我们需要做些什么,发送频率是2.4Ghz么? 哪个秘鲁首都噢利马成为“无雨城”的自然原因是什么? 浅谈已知函数的单调性求参数范围的几种方法 无线电波怎么划分的?与射频技术的区别? 求解答😂😂😂谢谢大神了, 旁通阀、限压阀的作用 犯罪片,讲一个人把他的妻子杀了,但是找不到证据,因为杀人的枪是警察的,谁知道电影名?那个警察和杀人犯的妻子有外遇 沸腾能杀死什么细菌 一个阻值为“220V 40W”的照明灯,接到电压为u=220根号2sin(100πt-30°)V的电源上,求通过照明灯的电流提问:一个阻值为“220V 40W”的照明灯,接到电压为u=220√2sin(100πt-30°)V的电源上,求通过 二重积分(x+y)^2dxdy,D由x^2+y^2>=2x,x^2+y^2<=4x.极坐标角度和r怎么确定? 爱好记号笔快没水怎么办 某校办工厂某校办工厂的年产值是15万元,如果每增加100元投资某校办工厂的年产值是15万元,如果每增加100元投资,那么一年可增加250元的产值,若增加1.5万元投资,年产值可达多少万元?(记得用 哪个频段的电磁波发射的远 【基础好的大神进】小学数学没学好,数学渣问问小学的知识,给自己补补.基数和增长率那个,基数概念是什么?不要百度百科上太专业的解释!我看不懂的.还有增长率的问题,增长率我一直很陌 大气环流是大规模的热力环流吗 厄瓜多尔的首都基多的气候是什么?有什么特征? 什么水能隔绝细菌?最近我带了一个活动牙套,医生说取下来的时候放进冷水里,这是为什么? 凸多边形的对角线有几条 在真空中能传播的电磁波总共有多少频道?我们能够精确分辨的频率有多少种? 细胞器怎样进行自我复制? IF叫什么函数 穿过南美洲厄瓜多尔首都基多的那条特殊纬线是什么? 椭圆的中心是坐标原点,长轴在x轴上,离心率是根号3/2,点P(0,3/2)到椭圆上的点最远距离是根号7,求这个椭圆方程. 这个怎样用if函数excel的if函数“员工基本情况”工作表中根据员工所属的部门代号填入每个员工所属的部门名称.部门名称与部门代号的对应关系为:T01是工程部,T02为研究部,T03为开发部.要求 厄瓜多尔首都基多为什么要坐落在高山山谷 这个题,学渣努力中 向人体内注射药物后它在人体的流动路程是? 厄瓜多尔首都基多市位于( )板块和( )板块交界处?有的说是太平洋板块和美洲板块,我看书好像是南极洲板块和美洲板块,明天就考试,求全解 黄河的谚语有哪些 紫外线和红外线在日常生活中的应用 高1指数函数.急!我不是他舅进指数函数y=f(x)的图象经过点(a,e)则f(0)=? f(1)=? f(-a)=? 麻烦高手告诉我下,一定要步骤! 有关遥感前沿的问题.请问现在的遥感技术发展到了什么个状况,最新动态是什么?最新的研究成果有些什么?谢谢了!重点是问一下最新的研究成果是什么? 苹果手机能用金属外壳么 1)如果函数f(x)=a^x(a^x -3a^2 -1)(a>0且a≠1)在区间【0,+∞)上是增函数,那么实数a的取值范围是?2)设a,b,c都是正数,且3^a=4^b=6^c,则有2/c=2/a +1/b 请证明!3)已知2^a*5^b=2^c*5^d=10,求证:(a-1)(d-1)=(b-1)( 凸多边形共有20条对角线,它是几边形 是否存在有18条对角线的多边形?如果存在它是几边形 不存在 为什么一元二次方程的应用 试题 79、按药物对人体所产生的作用,可将毒品分为麻醉药品和精神药品.(是非题) A、对 B、错 为什么秘鲁首都利马建在热带沙漠中 一个凸边形共有20条对角线,它是几边形?是否存在有18条对角线的多边形?如果存在,它是几边形?如果不存在,说明道理 1:红外线在光谱的()端之外,紫外线在光谱的()端之外,红外线和紫外线对人眼().2:一切物体都1:红外线在光谱的()端之外,紫外线在光谱的()端之外,红外线和紫外线对人眼().2: 厄瓜多尔首都基多为什么坐落在高山山谷中?秘鲁首都利马为什么坐落在太平洋沿岸的热带沙漠中? 一个凸多边形共有20条对角线,它是几边形?是否存在有18条对角线的对边形?如果存在,它是几边形?如果不存在,说明得出结论的道理. 9.8米/秒平方是什么意思这是数学的,这个等于多少 秘鲁首都利马,坐落在太平洋沿岸平均海拔105米的热带沙漠中,人口640多万.为什么呢?厄尔多瓜首都基多,坐落在赤道附近平均海拔2850米的高山山谷中,人口达140万,为什么呢?(人教版七年级下期 手机充电器测试怎样接灯泡? 非凸形的多边形该怎么求 对角线线数 求公式 强风暴席卷北欧地区 造成大面积交通瘫一架直升机在莫斯科坠毁 未致地面人员消息称美考虑停止对盟国领袖监听 未做强风暴席卷北欧地区 造成大面积交通瘫一架直升机在莫斯科坠毁 未致地面人员中非民兵与前叛军爆发冲突 造成近40埃及穆兄会领袖案开审 三名法官请辞印度连环爆炸案系激进组织所为日俄将首次举行外长防长级磋商 欲促进美国批发物价指数9月环比下降0.1%浙江武义江遭日化企业偷排污水 环保部强风暴肆虐欧洲多国IAEA称与伊朗会谈富有成果 将于1叙反对派要求解除卜拉希米叙问题特别代IAEA称与伊朗会谈富有成果 将于1美驻吉尔吉斯使馆收到不明信封 内装白金砖国家共议“气候变化对粮食安全不利消息称美考虑停止对盟国领袖监听 未做快讯:俄罗斯一架武装直升机在莫斯科市中国游客成海外大买家 凸显国内免税业中非民兵与前叛军爆发冲突 造成近40严格执法公正司法正义看得见日本部分高校面临生存挑战央视:反腐力度将再升级卫计委:我国有近百万对单独夫妇申请“中国疾病应急救助制度已救助患者近33写一本给老百姓的“民情日记”河南中招体育测试方案出炉 成绩计入总河南首批核准19所高校章程 年底达到动画艺术家张松林214件藏品“扎根”2015“宁夏系列蓝皮书”发布徐世澄:中拉深化合作将给双方百姓带来广州警方捣毁特大跨境贩毒集团 缴获冰邢台县地税局“e税通”服务平台方便纳《查理周刊》之殇:为了自由,忘了博爱甘肃兰州办税厅见闻:这里刮起“快闪风60辆新能源电动公交车在任丘“上岗”朝鲜开发熊胆护肝“神药” 已获朝鲜专新疆沙湾县柳毛湾镇人民政府召开征求意俄媒:俄总统新闻发言人提普京出席俄乌贵州黔东南州榕江县扶贫开发办主任李勇日拟推动首相参拜靖国神社正常化 韩指
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘