'NetMessageBufferSend':这个函数没有定义,是你在引用这个dll之前没有把相应的函数引用的原因吧

解决方案 »

  1.   

    函数是这样的,请问如何引用?
    function NetMessageBufferSend(servername:PWideChar;
             MsgName:PWideChar;
             FromName:PWideChar;
             Buf:PWideChar;
             var BufLen:integer):integer;stdcall;external'netapi32.dll';
      

  2.   

    我copy你的代码,怎么没有报错???
      

  3.   

    sundayboys(sunboy) :
    是不是在单元头加上了
    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.