如何搜索出网络上可用的打印机? 我也不会,刚刚在MSDN里乱找了一下,看到有一个EnumPrinterConnections函数,也许有用。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个函数好像不是API吧,不知怎么用法? 在EDIT1中输入‘\\’+计算机名称得到计算机的共享资源,],输入工作组名,得到工作组成员,使用如下代码,改改的话就可用来找所有共乡的打印机了function tform1.getshare(mydir : string):tstrings;VarEnumHandle : THandle;FileRS : TNetResource;Buf : Array[1..500] of TNetResource;BufSize : DWord;Entries : DWord;s1 : tstringlist;Result1 : Integer;begins1:=tstringlist.create;mydir := mydir + #0;//mydir为工作组名时可以得到组内所有主机名//mydir为主机名时可以得到机内所有共享文件夹名FillChar(FileRS, SizeOf(FileRS) , 0); With FileRS do begin dwScope := 2; dwType := 3; dwDisplayType := 1; dwUsage := 2; lpRemoteName := @mydir[1]; end; WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,@FileRS,EnumHandle );RepeatEntries := 1;BufSize := SizeOf(Buf);Result1 := WNetEnumResource( EnumHandle,Entries,@Buf,BufSize );If (Result1 = NO_ERROR) and (Entries = 1) thenbegins1.Add(StrPas(Buf[1].lpRemoteName)); //得到网上资源名,主机或文件夹if Buf[1].dwType =2 thenbegin s1.Add('打印机');endelseif Buf[1].dwType =1 then s1.Add('文件夹');end ;Until (Entries <> 1) or (Result1 <> NO_ERROR);WNetCloseEnum( EnumHandle );result:=s1;end;procedure TForm1.Button1Click(Sender: TObject);var s1 : tstrings; i : integer;beginform1.ListBox1.items.assign(getshare(edit1.text));end; 可以用EnumPrinters函数(WinSpool中)procedure TForm1.ReportMessage(const AMsg: string);begin Memo1.Lines.Add(AMsg);end;procedure TForm1.SearchPrinters;var Buf, List: PPrinterInfo1; BufSize, PrinterCount: Cardinal; I: Integer;begin Buf := nil; BufSize := 0; PrinterCount := 0; ReportMessage('Searching...'); EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount); GetMem(Buf, BufSize); List := Buf; if EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount) then begin ReportMessage(IntToStr(PrinterCount) + ' printers availed. Require ' + IntToStr(BufSize) + ' bytes.'); for I := 0 to PrinterCount - 1 do begin ReportMessage('------------------------------------'); ReportMessage('Printer[' + IntToStr(I) + ']'); ReportMessage('Flags = ' + IntToHex(List.Flags, 8)); ReportMessage('Name = ' + String(List.pName)); ReportMessage('Description = ' + String(List.pDescription)); ReportMessage('Comment = ' + String(List.pComment)); Inc(List); end; FreeMem(Buf); end;end; 三楼的说得对,主要用这两个WNetOpenEnum(),WNetEnumSource(); SQL语句导出EXCEL的问题 图形跟踪鼠标 MYsql数据库问题.大家帮忙,很急~~!!!!!!!!!!!!!!!!!!!!!!!!! 怎样给正在处理数据的数据集加一个动态标示? ListView里如果得到鼠标点击是哪列? 关于NMFTP的使用的问题 mdi的问题(50分) 谁能告诉我updatesql控件和query控件相连时的用法,最好给段代码,比如删除代码或新增代码,在线等待。。。 混在北京,你呢? substr 在sas 和hive 环境下的使用的不同 怎样将二进制字符串转化为图片文件???(200分!高手紧急援助!) 怎样实现随机打印一个数据表的几个子段?
,输入工作组名,得到工作组成员,使用如下代码,改改的话就可用来找
所有共乡的打印机了
function tform1.getshare(mydir : string):tstrings;
Var
EnumHandle : THandle;
FileRS : TNetResource;
Buf : Array[1..500] of TNetResource;
BufSize : DWord;
Entries : DWord;
s1 : tstringlist;
Result1 : Integer;begin
s1:=tstringlist.create;
mydir := mydir + #0;//mydir为工作组名时可以得到组内所有主机名
//mydir为主机名时可以得到机内所有共享文件夹名
FillChar(FileRS, SizeOf(FileRS) , 0);
With FileRS
do begin
dwScope := 2;
dwType := 3;
dwDisplayType := 1;
dwUsage := 2;
lpRemoteName := @mydir[1];
end;
WNetOpenEnum( RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
0,
@FileRS,EnumHandle );
Repeat
Entries := 1;
BufSize := SizeOf(Buf);
Result1 := WNetEnumResource( EnumHandle,Entries,@Buf,BufSize );
If (Result1 = NO_ERROR) and (Entries = 1) then
begin
s1.Add(StrPas(Buf[1].lpRemoteName)); //得到网上资源名,主机或文件夹
if Buf[1].dwType =2 then
begin
s1.Add('打印机');
end
else
if Buf[1].dwType =1 then
s1.Add('文件夹');
end ;
Until (Entries <> 1) or (Result1 <> NO_ERROR);
WNetCloseEnum( EnumHandle );
result:=s1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s1 : tstrings;
i : integer;
begin
form1.ListBox1.items.assign(getshare(edit1.text));
end;
begin
Memo1.Lines.Add(AMsg);
end;procedure TForm1.SearchPrinters;
var
Buf, List: PPrinterInfo1;
BufSize, PrinterCount: Cardinal;
I: Integer;
begin
Buf := nil;
BufSize := 0;
PrinterCount := 0;
ReportMessage('Searching...');
EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount);
GetMem(Buf, BufSize);
List := Buf;
if EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount) then
begin
ReportMessage(IntToStr(PrinterCount) + ' printers availed. Require ' + IntToStr(BufSize) + ' bytes.');
for I := 0 to PrinterCount - 1 do
begin
ReportMessage('------------------------------------');
ReportMessage('Printer[' + IntToStr(I) + ']');
ReportMessage('Flags = ' + IntToHex(List.Flags, 8));
ReportMessage('Name = ' + String(List.pName));
ReportMessage('Description = ' + String(List.pDescription));
ReportMessage('Comment = ' + String(List.pComment));
Inc(List);
end;
FreeMem(Buf);
end;
end;
三楼的说得对,主要用这两个WNetOpenEnum(),WNetEnumSource();