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

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.

一网打尽当下NoSQL类型、适用场景及使用公司 初创公司Treasure Data:每天处理7000亿行数据的20万次查询 豌豆荚王俊煜:将推支付SDK 与开发者3:7分成 英特尔-百度移动应用测试中心(MTC)正式启动 Intel将在2014年为数据中心用户定制低功耗SoC芯片 情绪低落?没事,让计算机来帮你! 水果生意难做 前新浪架构师徐佳转行试水挖煤 思考软件开发中的快与慢 Apache CouchDB注入新鲜血液,整合分布式技术 CSS Shapes:Web设计人员的新工具 Android 4.3正式发布:四大新功能一览 史玉柱的创业经验谈 3G门户和GO桌面:海外推广的生意经 系统级编程语言性能大PK D语言成首选 解读Facebook第二季度财报 移动业务风生水起 如何避免失败,像Google一样玩转大数据 首届游戏运营技术论坛隆重开幕,共论大数据时代的游戏运营之道 OpenStack Swift遇到了Erasure Code 微软Win7 IE11开发者预览版发布 开始改进开发工具讨好开发者 个性化推荐服务商百分点宣布B轮融资1000万美金 全球著名互联网企业背后的开源力量 基础设施对决Facebook vs. Google:差距绝不是一点点 Amazon Q2财报同比转亏,但AWS反其道而行:高歌猛进! 开拓海外市场的两年:海外上线小技巧 SDCC 2013首批讲师名单出炉 一线工程师唱主角 [开源推荐] 跨平台的.NET运行环境 Mono 3.2发布 Heroku发布API平台Beta版 采用OAuth2.0安全授权 大数据时代:移动数据能为我们带来什么? iOS开发经验谈:如何提高应用开发效率? 贝索斯:你否定亚马逊的现在 我决定亚马逊的未来 谷歌新产品Chromecast:一夜之间价格从35美元飙至100美元 DOS下如何设置com口的中断使能寄存器.(具体说明) 监听服务为什么启动不了? 问:RSA加密算法中,加密长度同解密长度怎么选取?急!!! 怎样绕过代理服务接收邮件? 菜鸟问题请教。 我装上jbuilder7以后,编译原来的程序出问题了!! select distinct * into #temp from ziliao出错?错在什么地方?错误提示是。。。 服务器对象, ASP 0177 (0x80040111)ClassFactory 无法供应请求的类别? 二进制数的减法是怎样的? 各位朋友请救救我! 系统函数imagecreate(int x_size,int y_size)为什么会错误?是不是需要重新定义? sql数据库端口屏蔽怎么办? struct(结构) 类型可以转化为 Variant吗?怎么转化?然后如何将Variant类型的变量恢复为struct结构 用lotus script怎样实现对数据库指定文档的修改? 问个简单的线程问题,大家别见笑 :)!!! 关于asp.net的配置问题 jsp、oracle8.1.6的中文问题 在线等待 关于重新启动计算机的问题,谁能帮我? 各位,帮忙看看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! daehappy进来取分,感谢给分! 各位大虾,有谁知道oracle8i,oracle9i是如何报价的,非常感谢! daehappy进来取分,感谢给分! daehappy进来取分,感谢给分! 如何驗証日期類型? 打包是如何解决vcl60的错误? 很急,谢谢 请问:单文档中如何在退出时去掉弹出的“是否保存文件“消息? 还没有见过这样的贴子,但又在实践中经常碰到的问题,怪事。。。。 ??IDispatch error #3101:什么意思?? 怎样实现程序中的取消功能 各位,上海哪边的房子便宜一点?(700左右,房内只要有简单家俱即可!) 一个<xsl:if>的问题 vc6.0 能否直接编译.mak文件?该如何配置? 关于XP中的PF使用率和字体占用内存的问题 有关安装nt server的问题 有关安装nt server的问题 关于数据库用户的问题! 很奇怪的现象,有人知道吗? 初级问题 电脑自动重启,有点难度,高手请进,如果对,绝对给分! 怎样用DAO或ADO访问EXCEL数据表? 请问该事件可以通过发送消息或其他的方法来触发吗? 有没有关于开发控件的文章和例子,请各位大侠帮忙!!! 告诉那有免费的数字化软件马上送分200 请问哪里有 Remote Authentication Dial In User Service (RADIUS)的资料或原码? 我怎么不能看你们的问题啊 关于数据库 window.parent.oa_middle.oa_userlist.document.location.reload();报错:对像为空或不存在 看如下的sql语句如何才能够把结果显示在grid内? 准备学习j2ee, 大家推荐些网站和书籍,我准备狂啃二个月!对了,我连它的开发工具还不知道呢,是不是还用jbuilder? 初学者,如何在C++ Builder中打印? DCOM编程要求在客户端安装DCOM,怎样安装DCOM,怎样判断是否安装了DCOM? 用差压变送器测流量,其流量范围0-40t/h,差压范围是0-25KPa.当差压为4KPa时,对应被测流量是多少能写出详细的步骤 电力变压器油标有哪几种形式?并阐述磁铁式油标的结构和工作原理 电风扇功率计算电风扇开关写着3A 250V,请问功率多大,如果按照P=UI计算的话750W也太吓人了吧!电风扇其他地方找不到功率. 条形磁铁一端是N极另一端是S极,那么将它从中间折断,断口处应该一端是N极另一端是S极表现为相吸.但实际上是相斥,这种斥力并不是分子之间的斥力.这是为什么? 接触绝缘体大家说一下绝缘体和导体的区别好吗?我只知道取决于有无大量自由移动的电子.这个没有问题.那绝缘体转移电荷的能力怎样呢?比如当绝缘体带电的时候,虽然不能移动,但也能和与 电风扇电动机每分钟转化24000J的电能,那么这台风扇电动机的功率是多少? 如何鉴别Na2CO3 、K2CO3、NaCl和K2SO4?用化学方程式表示. 不要对姐放电,姐是个绝缘体!这句话怎么理解 能不能更我一份实验室减压抽滤装置图 如何鉴别 Na2CO3 N2CO3 NaCl 和 K2SO4 分别写出反应方程式 和 离子方程式 遇到不会做的题了 请大虾们指点迷津~送上老本 各位哥哥姐姐本人需要初二物理期中试卷08~09答案.急啊! 实验室用的减压浓缩装置都有什么减压浓缩和减压蒸馏有区别吗 尿素合成工艺及尿素合成工艺流程图 新疆乌鲁木齐新市区2008—2009学年第二学期八年级期中试卷(语数外物理)及答案 被称为活化石的是什么树 合成尿素的途径是 尿素合成的意义 什么树有“活化石”之称? 静电的危害有哪些? 天然气怎么合成尿素 所有汽车的一缸和四缸怎么辨别? 静电是怎样的,有什么危害? 合成尿素的流程是什么? 汽车悬架有哪几种,分别有甚么作用? 小鸟站在裸露的电线上,为什么不会触电? 吸铁石原理是什么? 使滑 动轴承处于液体动压润滑状态的充分必要条件是什么?这个是我们期末机械设计考试的一道题 它的题干就这样 按理论讲胶鞋不导电,人穿它手摸火线不会构成回路,但实际上还会触电,是什么原因? 关于溶解度的化学题 急~!小华走进化学实验室 发现瓶上的标签已破损 他问老师 这是什么溶液? 老师告诉他几种物质在当时温度时的溶解度后 他立即说该物质一定不是KNO3理由是__________________ 滑动轴承中 油润滑 边界润滑 无油润滑都是什么概念特别是边界润滑是什么样的润滑. 小鸟有时站在高压线上,但是并不会触电!那人要是去触摸裸露的电线,怎么接触可以不受伤?人去摸的裸露的电线,是家用的线路,不是高压线 把空气 乙醇 水 硫酸铵 铜 碘酒 碘 氧气 石墨 食盐水 分成易溶于水 和 难溶于水 标准状况下11.2L HCl溶于水形成500mL 溶液向其中加入___gNaOH才能中和完全若不考虑加入NaOH对体积造成影响,所得NaCl溶液物质的量浓度____ 说几种人的触电原理、小鸟在电线上为啥不触电呢?懂的来! 单联单控开关怎么接左上是L1旁边是L 右边是三向插头 左口是L右口是N上地线 没有L2 标准状况下22.4L HCl溶于水形成500mL 溶液,求所得盐酸的物质的量浓度及H+物质的浓度. 含有叫字意思的词语 【关于溶解度的化学题】像20℃的饱和澄清石灰水(甲溶液)中投入适量的氧化钙粉末,充分反应,下列说法错误的是A 溶液温度未冷却到20℃时,溶液一定是饱和溶液B 溶液温度未冷却代20℃时,溶质 液态金属微粒间的作用力是什么? 含有“想”的意思的2字词语急 求单控开关的接法 标准状况下11.2L HCL溶于水形成500ml溶液,若不考虑加入NaOH对体积造成的影响,所得NaOH物质的量浓度外在向其加入————ml密度为1.7g/cm3质量分数为25%的AgNO3溶液可使CL-完全沉淀 磁铁怎样发电今天去hoover dam 在里面看见一个很简单的发电装置是一个转的东西 带动一个u型的磁铁转动 此天的两头个有一个铁柱吧可能 上面缠着小型马达上面的那种线 然后分别把他们连到 有关溶解度的化学题1.20℃时,100g水中最多能溶解10gX的物质,60℃时,200g水中最多能溶解20gY物质,下列判断正确的是A.Y比X更易溶于水B.X比Y更易溶于水C.X和Y的溶解度相同D.X和Y的溶解度大小关系无 【高一化学、微粒之间的相互作用力】分子晶体熔化、汽化升华、溶于水要不要断键:离子晶体…原子晶体…金分子晶体熔化、汽化升华、溶于水要不要断键;离子晶体熔化、汽化升华、溶 求圆形磁铁发电原理!我拆了一个手握发电的手电筒,连接灯泡的有三根铜线,求转动到灯泡发光过程详解,尤其是圆形磁铁的发电原理!手握的时候里面转速会很快,一端力量大,这个是怎么转 四位单控开关的接法刚买了耐博四位一控开关,不知怎么接, 病刚好,身体恢复健康什么词语 我经常听说过磁生电,电生磁.我想知道如何能用磁石来发电,而且是可以亮灯泡的那种啊,废话不要说直奔主题.说明白一点,比如说导线是什么。3F的,你说用磁石弄成一个管子,电线在中间转 20°时NaCl的溶解度为36g,则此时NaCl溶液的质量分数是多少 强壮而有力是什么词语?、 磁铁可以用来发电吗? 汽车六缸三菱变速箱的大力古起什么作用变速箱与发动机接合的那里的 健康这个词怎么解释 某气体可能含有一氧化碳,二氧化碳,氮气,氢气中的一种或几种,现将气体通过澄清石灰水没出现浑浊,再将该气体在空气中点燃,在其火焰上方找一个冷而干燥的小烧杯,其内壁无小液滴生成,向 管状电机通过磁铁和霍尔元件控制行程,具体工作原理是怎样的?磁铁装在什么上面? 钕磁铁与普通磁铁的相吸和相斥我在玩磁铁的时候发现了一个问题:钕磁铁与一般磁铁(成分是四氧化三铁)之间不存在同性相斥的现象,只是磁铁间的吸引力不同,同性的要大一点,异性的要 含有褒义词意思的二字词语 驾校考场的地面上有磁铁,这是什么工作原理的感应器,能感应汽车的停放位置? 双控开关和三控开关一样吗?是不是只是线的接法不一样
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘