'NetMessageBufferSend':这个函数没有定义,是你在引用这个dll之前没有把相应的函数引用的原因吧
解决方案 »
- 要使小数点左边固定某长度(如5位),小数点右边保留2位,要使用哪个格式化函数?
- FastReport的两个问题
- 关于远程访问数据库问题
- 请问null和nil有什么区别啊?还有字段对象的AS+数据类型中AsBCD这个TBCK型的数据到底是什么样子的啊?谢谢@
- 一个checkbox和combobox的综合应用问题?望高手解答!(在线等)
- 文件位置居然与盘符无关? 求高人解答!(100)
- delphi 开发的程序能不能在WINDOWS2000服务器上安装,能不能正常运行:;
- DELPHI里的ADOQUERY控件怎样实现两张表的交叉查询?高手在哪?
- Dbgrid的自动换行问题
- 请问速达3000pro的报表设计器是什麽控件!
- IntrBase datatype err?
- 资源文件里有太多的垃圾,我怎么去掉!
function NetMessageBufferSend(servername:PWideChar;
MsgName:PWideChar;
FromName:PWideChar;
Buf:PWideChar;
var BufLen:integer):integer;stdcall;external'netapi32.dll';
是不是在单元头加上了
function NetMessageBufferSend(servername:PWideChar;
MsgName:PWideChar;
FromName:PWideChar;
Buf:PWideChar;
var BufLen:integer):integer;stdcall;external'netapi32.dll';
如果加了的话请先让其去掉,
因为这是静态调用
在win98里运行时会报错
只能在win2000里运行
所以只能动态调用
要不我把整个pas都贴出来!
如下所示:unit SendMessageOfNet;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, StdCtrls, Buttons;type
TSendMessageOfNetForm = class(TForm)
StatusBar1: TStatusBar;
PanelTop: TPanel;
PanelFoot: TPanel;
BitBtnSend: TBitBtn;
BitBtnExit: TBitBtn;
PanelMain: TPanel;
PanelMTitle: TPanel;
Panel1: TPanel;
Memo1: TMemo;
Label1: TLabel;
ComboBox1: TComboBox;
SpeedButtonFindCompute: TSpeedButton;
Label2: TLabel;
ComboBox2: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtnSendClick(Sender: TObject);
procedure SpeedButtonFindComputeClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtnExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
SendMessageOfNetForm: TSendMessageOfNetForm;
CurDir:string;
function ToUnicode(str:string;dest:PWideChar):integer;
function SendMsg(Toh,From,Msg:string):integer;
function SelectComputer:string;implementation{$R *.DFM}
uses FileUtil, ShlObj, ActiveX;
const MComputerListFile='ComputerList.dat';function SelectComputer:string;
var WindowList:Pointer;
BrowseInfo:TBrowseInfo;
Buffer:PChar;
RootItemIDList,ItemIDList:PItemIDList;
ShellMalloc:IMalloc;
begin
Result:='';
FillChar(BrowseInfo,SizeOf(BrowseInfo),0);
if (ShGetMalloc(ShellMalloc)=S_OK) and (ShellMalloc<>nil) then begin
Buffer:=ShellMalloc.Alloc(MAX_PATH);
try
RootItemIDList:=nil;
SHGetSpecialFolderLocation(Application.Handle,CSIDL_NETWORK,RootItemIDList);
with BrowseInfo do begin
hwndOwner:=Application.Handle;
pidlRoot:=RootItemIDList;
pszDisplayName:=Buffer;
lpszTitle:='选择机器名';
ulFlags:=BIF_BROWSEFORCOMPUTER;
end;
WindowList:=DisableTaskWindows(0);
try
ItemIDList:=ShBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end;
if ItemIDList<>nil then begin
Result:=StrPas(Buffer);
ShGetPathFromIDList(ItemIDList,Buffer);
ShellMalloc.Free(ItemIDList);
end;
finally
ShellMalloc.Free(Buffer);
end;
end;
end;function ToUnicode(str:string;dest:PWideChar):integer;
var len:integer;
begin
StringToWideChar(str,dest,len);
Result:=len;
end;function SendMsg(Toh,From,Msg:string):integer;
var ToName:array[0..64] of WideChar;
WMsgText:array[0..1000] of WideChar;
MsgLen,i:integer;
Moudle:THandle;
PFunc:TFarProc;
begin
for i:=0 to 64 do ToName[i]:=#0;
ToUnicode(Toh,ToName);
for i:=0 to 1000 do WMsgText[i]:=#0;
ToUnicode(Msg,WMsgText);
Moudle:=Loadlibrary('netapi32.dll');
if Moudle>32 then begin
Pfunc:=GetProcAddress(Moudle,'NetMessageBufferSend');
Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen); //就这里报错
end;
Freelibrary(Moudle);
end;procedure TSendMessageOfNetForm.FormCreate(Sender: TObject);
var FileName,MTempStr:string;
I:integer;
MComputeList:TStringList;
begin
CurDir:=NormalDir(ExtractFilePath(Application.EXEName));
FileName:=CurDir+MComputerListFile;
ComboBox1.Items.Clear;
ComboBox1.Text:='';
if FileExists(FileName) then begin
MComputeList:=TStringList.Create;
MComputeList.LoadFromFile(FileName);
For I:=0 to MComputeList.Count-1 do begin
MTempStr:=Trim(MComputeList.Strings[I]);
if MTempStr<>'' then ComboBox1.Items.Add(MTempStr);
end;
MComputeList.Free;
end;
if ComboBox1.Items.Count>0 then ComboBox1.ItemIndex:=0;
Memo1.Lines.Clear;
ComboBox2.ItemIndex:=0;
end;procedure TSendMessageOfNetForm.FormActivate(Sender: TObject);
begin
Memo1.SetFocus;
end;procedure TSendMessageOfNetForm.FormClose(Sender: TObject;
var Action: TCloseAction);
var FileName:string;
begin
FileName:=CurDir+MComputerListFile;
ComboBox1.Items.SaveToFile(FileName);
end;procedure TSendMessageOfNetForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ComboBox2.ItemIndex=1 then begin //按 Ctrl+Enter
if Key=17 then begin
BitBtnSendClick(self);
Memo1.Lines.Clear;
end;
end;
if ComboBox2.ItemIndex=2 then begin //按 ENTER;
if Key=13 then begin
BitBtnSendClick(self);
Memo1.Lines.Clear;
end;
end;
end;procedure TSendMessageOfNetForm.SpeedButtonFindComputeClick(
Sender: TObject);
var S:string;
begin
S:=SelectComputer;
if ComboBox1.Items.IndexOf(S)=-1 then
ComboBox1.Items.Add(S);
ComboBox1.Text:=S;
Memo1.SetFocus;
end;procedure TSendMessageOfNetForm.BitBtnSendClick(Sender: TObject);
var Ret:Integer;
MTempStr:String;
begin
if Trim(ComboBox1.Text)='' then begin
MTempStr:='请选择接收方的计算机名称!';
Application.MessageBox(Pchar(MTempStr),'警告',Mb_iconstop);
Exit;
end;
if Memo1.Lines.Text='' then begin
MTempStr:='不能发送空的信息!';
Application.MessageBox(Pchar(MTempStr),'警告',Mb_iconstop);
Exit;
end;
Ret:=SendMsg(ComboBox1.Text,'',Memo1.Lines.Text);
if Ret<>0 then begin
MTempStr:='发送失败!';
Application.MessageBox(Pchar(MTempStr),'出错提示',Mb_iconstop);
Exit;
end;
Memo1.Lines.Clear;
end;procedure TSendMessageOfNetForm.BitBtnExitClick(Sender: TObject);
begin
Close;
end;end.