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

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.

Framer:开源原型设计工具,巨头们的心头好 亚特兰大峰会精彩看点:软件吞噬世界,OpenStack是变革核心 数据中心基础设施是大数据战略成败的关键 实时大数据分析:网络分析的一种新方法 最新消息:iPhone 6将采用更大、更清晰的1704x960分辨率屏幕 吴毅挺:OpenStack是开源IaaS平台大势所趋的集大成者 做好扁平化设计-交互篇 狙击Google Glass?三星将推基于Tizen系统的Gear Glass GamePlay:跨平台开源3D游戏引擎,黑莓的努力你不懂 “少即是多” 高通QRD大会精华汇总 天云盾:构筑在云端的Web安全防护 解析大数据时代的数据库集群技术 莫里航海图,最早的大数据实践 弥补空缺!HappyFox面向iOS开发者发布开源移动HelpDesk SDK Chitika北美网络流量报告:WP KO黑莓、iOS超Android 《近匠》秦时明月:知名IP光环下的生存之道 微软研究院正式发布编程学习游戏Code Hunt 走近讲师:Memblaze刘爱贵讲述云计算中的闪存应用 【云先锋】ClouDil云方案:PB级大数据解决方案 一周消息树:这是要“发”啊?Google Brain之父正式加盟百度 最受欢迎的游戏引擎集结号:小白篇 多盟总设计师邢开捷:四两设计拨千金 Cocos2d-x游戏《Monster Strike》终结《智龙迷城》霸榜神话 高通物联网技术解决方案:从汽车到智慧城市 Arduino携手Atmel 发布Arduino Zero开发板 以色列玫瑰:细数十位科技创新领域的女性佼佼者 8款最佳的开源在线学习CMS系统 在发布站点前,Web开发者需要关注哪些技术细节? TOCC、中航信、高德、北斗平台重磅专家登场 邀您共享ITS技术盛宴 腾讯大数据之TDW计算引擎解析——Shuffle AMD APU14 BEIJING技术创新大会精彩看点 关于 int[][][] a = new int[3][3][3] 再问clavy(有巢无车氏) 和 wqxtt(wqxtt) 关于WINCE 下ACCESS 与 WINDOWS 下ACCESS 的转换 关于C/S结构的问题?快帮我啊!!! 各位programer加班有加班工资吗? 代理服务器的原理?——有谁知道! 请问怎么在一个对话框程序的文本框中绘图 请问windows网络程序PING编程技术里的几个问题,ICMP回显里面的timestamp是怎么纪录进去的 什么地方可以Down rose?或谁寄给我一个? 编写一个函数,通过指针连接两个字符串!!!!!!!!!!!! 用applet怎样打开一个文件吗? 请问哪种ORB产品实现了com服务器/corba客户机的桥 我读《深入探索C++对象模型》的感受,cber能再回答我一次么? 谁有DELPHI的有关网络编程方面的资料?给我一份可以吗? 关于stringgrid的问题????? 痛苦啊,难道要放弃BCB吗? 大家认为在开发过程中是否不能用全局变量? 如何让LINUX支持我显卡 高手,谁来帮我一下~! 取字符 在SDK中,如何获得客户区的宽度和高度呢??(哪两个函数呢?) 哪里有ATL的电子书下载?最好是中文的! 高手谁能帮帮我呀~~~~~~~! 请教:如何在statusbar的panel中显示一个图标呢? VC++中如何使用OLE对象? 初来乍到,发现这儿JJMM还挺多的。。。 请高人指教~! CSDN中碰到这种问题,该如何解决呢? 如何学习director 你能帮我一下吗?~ 企业商务管理软件,开放全部的源代码及开发文档! 企业管理软件,全套源码及开发文档!!!! 哪里有支持任何波特率的通讯控件下载? net_lover(孟子E章)请进~! 一个有关CWebBrowser的问题,急急急!!! 这样的语句为什么不可以实现一次删除多条记录 plmm是什么意思? 各位大侠,知道哪儿有直接可用的上传文件的控件吗? 多谢了!!! 论坛的题目是不是太没意思了 一个sqlserver7统计的问题?? varchar类型不是可以输入255个字符吗,为什么我输了160个就出现'item XXX doesn't pass validation test ' 唉 ~~~~~ 奈何 ~~~~~ 突然想到个荒唐的问题: 事件和过程有什么不同? 奇怪的事前,高手请进来 我的问题还没有解决~! 这里的高手呢,人听多,会的人不多 申奥倒计时,如果你在线,请进来验证这以历史性时刻,谢谢 我有一个用hook截获鼠标移动的dll,但是没有效果,请问怎么调试? 请教,怎样在java中把Button的背景改做一个图片 对delphi5一个自带例题的疑问。 爆炒MM之水园MM ID一览 窗体和控件的自适应问题? 已知,如图,在三角形abc中,AD,AE分别是三角形ABC的高和角平分线,试问角DAE与角C-角B有怎样的数量关系,说明理由 初二上册数学直角三角形全等的判定,同步练习那一题.已知:如图,在三角形ABC和△A'B'C'中,角ACB=角A'C'B'=90°.,CD,C'D'分别是△ABC和△A'B'C'的中线,且CD=C'D';CE,C'E'分别是△ABC和△A'B'C'的高线,且CE=C'E' 8.4÷﹙2.1×5﹚简便计算 如图,已知,AF分别是两个钝角三角形ABC和三角形ABE的高,如果AD=AF,AC=AE,求证:BC=BE 如图 在三角形abc中,角acb=90°且de是三角形abc的中位线,延长ed到f,使df=ed,连接fc,fb,回答下列问题1..求证:四边形BECF使菱形2.当角A的大小满足什么条件是,菱形BECF使正方形?请回答并证明你的结论 (-510)/(+34)/(-0.125)简便运算大师帮忙~ 已知:如图,AD,AE分别是三角形ABC和三角形ABD的中线.如图,AD,AE分别是三角形ABC和三角形ABD的中线,且BA=BD.求证:AE=二分之一AC. cos(arc sin x/a)等于什么还有反三角函数公式里的一些类似的! 人教版五年级上册数学指导第9页跳一跳0.34×12.5+0.125×66 如图,AD是三角形ABC的中线,AE垂直AC,AF垂直AB,且AE=AC,AF=AB,求证:AD=1/2EF 若a=arc sin(sin3分子4π),则a的值 用梯等式求50*96+57*4+7*66 如图,三角形ABC中,角BAC等于120度,AD垂直BC于D,且AB+BD等于DC,求角C的度数 (arc sin x)/(x)的极限是?x趋于0 57乘66分之23如何简便运算? 已知:如图,在三角形ABC中,AD垂直于BC,垂足为点D,AD^2=BD*DC.求证:三角形ABC是直角三角形.今晚之前给我,最好8:15之前交给我 计算:sin[arc*sin(3/5)+arc*sin(7/18)] 数学题怎么算 /80 = 66 怎么计算 如图,在三角形ABC中,已知角BAC=120度,AD垂直于BC,AB+BD=DC,求∠C的度数. arc sin (25/99)等于多少度啊?谁手边有计算器帮忙按一下下呗 谁给我出题,80道数学题,(简算)和(方程) 如图9,三角形ABC中∠BAC=120°,AD垂直BC于点D,AB+BD=DC求∠C的大小 arc sin(-1/2)=? 给80分 用算除法小风 小玉 小明是幼儿园里最好的朋友 小风体重14KG 正好是小明体重的8分之7 而小明比小玉的重15分之1,小玉体重应该是多少千克 修一条路,第一天修了8分之3,第2天修了第一天 如图 在三角形abc中,bd=dc,∠1=∠2,求证:ad垂直bc. sin ( arc sin л/6 ) =多少?还有一道:arcsin(cos 7л/6) = 1+1.2+1.4+1.6+.+9.6+9.8+10怎简便算法 如图,三角形ABC全等于三角形A'B'C',AD,A'D'分别是三角形ABC,三角形A'B'C'的如图,三角形ABC全等于三角形A'B'C',AD,A'D'分别是三角形ABC,三角形A'B'C'的对应边上的中线.AD与A'D&# ARC sin 0.91ARC( sin 0.91) 是多少的角度啊 用简便算法计算:48×110-4×48-8×48+2×48 如图 三角形ABC相似于三角形A'B'C',相似比为k,AD A'D'分别是边BC B'C'上的中线,求证AD比A'D'等于k 5分1比1和3比15可以组成比例对吗 (12.5+0.125)×8-81的简便算法 如图 在三角形abc中,d是ab上一点,且ad等于cd等于bdde,df分别是角bdc和角adc的平分线,求证:四边形cfde是矩形 0.47*2.5*0.4怎样简便运算 1.6*7.5*1.25.请用简算法. 如图,在三角形ABC中,角B=44度,角C=72度,AD是三角形ABC的角平分线.(1)求角BAC的度数;(2)求三角形ADC的度数 0.47*5.9+5.2*4.7-4.7*0.1怎么样简便计算? 6.25*2.7+6.5*1.25的简便算法 如图,在 三角形ABC中,角C=90度,AD平分角BAC,且角B=3倍的角BAD,求角ADC的度数 63+0.63*2.5+0.63*6.5怎样简便计算, 3.14*1.375+0.314*6.25-3.14*0.2 的简便算法 如图,AD为三角形ABC中角BAC的角平分线,DE为三角形ABC的中线.若三角形ABC的面积为24平方厘米,AB=8cm,AC=4cm,则三角形BED的面积为多少?要过程!急! 简便计算185/25-4.5/2.5 1.25*7.1+1/8*2.6+0.375的简便算法 如图,在三角形ABC中,∠ACB=90°,AC=AE,BC=BF则角ECF等于 5.2×4.8+4.8×4.8简便计算算出来讲原因 1.25*1.6*1.5简便算法 如图在三角形abc中角acb等于45度角a等于九十度bd是角abc的平分线ch 2.5×2.4÷1.4+4.8÷2.1×2.5的简便运算 1+2-3-4+5+6-8+9···+1997+1998-1999数一个没错,让你计算, 如图,在三角形ABC全等于三角形A’B’C’,角∠ACB等于90°,∠A等于25°,点B在A’B’上,D是BB’的中点,连接CD,求∠ACA’的度数 简便运算:4/11*(2/5-1/4) 333*333怎样用简便方法计算? 如图 在rt三角形abc中 角acb等于90度 a=5 c=13 求b若斜边AB上的高为CD 求CD 简便运算:40.5÷1/4*[(1-1/4)*1.2] 333乘以333用简便方法怎么算 如图,在三角形ABC中,AD是BC边上的高,AE是三角形ABC的角平分线.若角B等于α,角C等如图,在△ABC中,AD是BC边上的高,AE是△ABC的角平分线。若∠B等于α,∠C等于β(α<β),用含α,β的代数式来表示 如图,在三角形ABC中,角ACB=90°,角A=60°,CD,CE分别是边AB上的中线和高.求证角ACE=∠ECD=∠DCB 简便计算4.5*9*1.2=?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn