我用 NetMessageBufferSend 发送信使时,在有的机器上可以使用,但是在有的机器上怎么也不能使用,但是用 Net send 是可以的,请教各位高手,这是什么原因?

解决方案 »

  1.   

    windows 2000,xp把那个服务关闭了
      

  2.   

    服务里边有个Message服务,打开就可以发送了
    运行:net send 127.0.0.1 hello world!
      

  3.   

    上面两位,我是在 Net send 可以使用的情况下的,也就是 Messager 服务已经打开了
      

  4.   

    我用的是 Win2000 Server 和 XP 做的试验,以前是可以的,后来也不知道是怎么搞的就不行了,一直到现在用户给我反应,我才发现了这个问题。
      

  5.   

    可是我明明可以用 Net send 发送的,并且我用 MsgSend 2.51 发送也是可以的,真不知道是怎么回事!
      

  6.   

    NetMessageBufferSend ,是什么东东?bug??
      

  7.   

    没有用过,我直接是用net send...,那是个软件吗?还是命令啊,我学习学习
      

  8.   

    是一个 Windows NT 以后系统的一个 API 函数,你可以用这个在网上查一下
      

  9.   

    是不是对与不同系统传递参数不同啊?我回去看看了,现在手头没有msdn
      

  10.   

    在windows 2000 server服务里边,如果说确定Messenger服务已经开启,
    可以使用这样的方法发送消息:(写的有些麻烦了),我的意思是,换一种方
    法发送看看行不行?早上刚好有空,就抓紧写了一下,希望对你有帮助.
    实在不行,你去www.ccrun.com搜索一下,有个"用C++Builder实现Windows 2000的Messenger"
    的文档,你可以参考一下,图文并茂,写的很清楚的,非常适合局域网内的发送实现.
    //Windows 2000 Server sp4\C++Builder 5+up1
    //-----------------------------------------------------------
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      AnsiString sendStr;
      sendStr="NET SEND";
      sendStr+=" ";
      sendStr+="127.0.0.1";
      sendStr+=" ";
      sendStr+="Hello World! ";
      WinExec(sendStr.c_str(),SW_HIDE);
    }
    //-----------------------------------------------------------
    //Windows 2000 Server sp4\Delphi 6+up2
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      str:string;
    begin
      str:='NET SEND';
      str:=str+' ';
      str:=str+'127.0.0.1';
      str:=str+' ';
      str:=str+'Hello World!';
      WinExec(pchar(str),SW_HIDE);
    end;
    //-----------------------------------------------------------
    //Windows 2000 Server sp4\VC++6,最后还可以看到一个返回的消息,提示发送成功
    //-----------------------------------------------------------
    #include "stdafx.h"
    #include <windows.h>int main(int argc, char* argv[])
    {
    printf("This Program Is SendMessage For Windows 2000 Server\n");
    printf("   If Your System's Messenger Server is Running!   \n");
    printf("       Press Any Key To Send Messenger...          \n");
    getchar();
    ::WinExec("NET SEND 127.0.0.1 Hello World!",SW_HIDE);
    return 0;
    }
    //--------------------------------------------------------
      

  11.   

    ////////copy from other source:void __fastcall TFormMain::ButtonSendClick(TObject *Sender)
    {
     AnsiString Message,UserName,FromName;
     TListItem *ListItem;
     if(CheckBoxAnony->Checked)FromName=EditAnony->Text;
     else FromName="";
     Message=Memo1->Text;
     if(Message==""){ShowMessage("Please Enter words to send");return;}
     if(!ListView1->SelCount){
      if(TreeView1->Selected==NULL){ShowMessage("Please select destnation");return;}
      UserName=TreeView1->Selected->Text;
      if(TreeView1->Selected->Level==1)UserName=UserName+"*";
      new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
     return;
     }
     ListItem=ListView1->Selected;
     UserName=ListItem->Caption;
     if(TreeView1->Selected->Level==0)UserName+="*";
     while(UserName[1]=='\\')
    UserName=UserName.SubString(2,UserName.Length()-1);
     new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
     for(int i=1;iSelCount;i++){
     ListItem=ListView1->GetNextItem(ListItem,sdAll,TItemStates()<  UserName=ListItem->Caption;
     if(TreeView1->Selected->Level==0)UserName+="*";
     while(UserName[1]=='\\')UserName=UserName.SubString(2,UserName.Length()-1);
     new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
     }

      以下是网络结点枚举函数,是个线程 bool __fastcall EnumNetResource::GetNetRes(
    TTreeNodes *Nodes,TTreeNode * Node,NETRESOURCE *pNetResource,int Depth)
    {
    #define ENUMBUFSIZE (16*1024)
    #define ENUMCOUNT 10
    NETRESOURCE buff[1024];
    AnsiString UserName;
    if(Terminated) return false;
    if(Nodes==NULL) return false;
    if(Depth==0) return true;
    HANDLE hEnum;
    bool reValue=true;
    NETRESOURCE *pNetRes,NetRes;
    if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,
    pNetResource,&hEnum)!=NO_ERROR)return false;
    DWORD ECount=ENUMCOUNT;
    DWORD ESize=ENUMBUFSIZE;
    DWORD Error_num;
    do{
    Error_num=WNetEnumResource(hEnum,&ECount,buff,&ESize);
    if (ESize>ENUMBUFSIZE) return false;
    if (Error_num==NO_ERROR){
    for (DWORD num=0;num if(Terminated)return false;
    pNetRes=&buff[num];
    file://if(Node)Node->ImageIndex=1-Depth;
    UserName=AnsiString(pNetRes->lpRemoteName);
    while(UserName[1]=='\\')
    UserName=UserName.SubString(2,UserName.Length()-1);
    TTreeNode *tNode=Nodes->AddChild(Node,UserName);
    if(tNode)
    switch(pNetRes->dwType){
    case RESOURCETYPE_ANY:
    switch(tNode->Level){
    case 0:tNode->ImageIndex=1;break;
    case 1:
    case 2:tNode->ImageIndex=2;break;
    }
    break;
    case RESOURCETYPE_DISK:tNode->ImageIndex=3;break;
    case RESOURCETYPE_PRINT:tNode->ImageIndex=4;break;
    }
    if(pNetRes->dwDisplayType!=RESOURCEDISPLAYTYPE_SHARE){
    if(!GetNetRes(Nodes,tNode,pNetRes,Depth-1)) reValue=false;
    }
    }
    }
    }while(ECount==ENUMCOUNT);
    if (Error_num!=ERROR_NO_MORE_ITEMS && Error_num!=NO_ERROR) reValue=false;
    WNetCloseEnum(hEnum);
    return reValue;

      以下是多线程发送函数,是个线程 void __fastcall NetMessageSend::Execute()
    {
    file://---- Place thread code here ----
    const maxlen=1600;
    wchar_t *pMsgBuff;
    AnsiString retstr;
    long int retvalue,msglen,sendlen;
    msglen=FMessage.WideCharBufSize();
    pMsgBuff=(wchar_t *)malloc(msglen*2+10);
    FMessage.WideChar(pMsgBuff,msglen);
    for(long int i=0;i if((msglen*2-i)>maxlen)sendlen=maxlen;
    else sendlen=msglen*2-i;
    retvalue=NetMessageBufferSend(NULL,FUserName,pFromName,(char *)pMsgBuff+i,sendlen);
    }
    if(FGetRet){
    switch(retvalue){
    case NERR_Success:
    retstr="@_@ Sent OK!";
    break;
    case ERROR_ACCESS_DENIED:
    retstr=":( Has no access";
    break;
    case ERROR_INVALID_PARAMETER:
    retstr=":( Parameter error.";
    break;
    case ERROR_NOT_SUPPORTED:
    retstr=":( Network not supported.";
    break;
    case NERR_NameNotFound:
    retstr=":( Parameter is invalid.";
    break;
    case NERR_NetworkError:
    retstr=":( General failure network hardware.";
    break;
    default:
    retstr=":( Unknow error";
    break;
    }
    Application->MessageBox(retstr.c_str(),("Result for "+AnsiString(FUserName)).c_str(),MB_OK);
    }
    free(pMsgBuff);
    }  
      

  12.   

    我之前也碰到你这种问题,后来查出原因在于两台机上的 NetAPI32.dll 这两个文件版本不一致,后来把我机上的文件发布到那台机上,问题解决。
      

  13.   

    wychero(高天) :我的情况不仅是不能发送到其他的机器上,连我自己的机器都不能发……汗!
      

  14.   

    谢谢上面各位的参与,我现在找到了原因,是因为我在填 From 机器名的时候允许用户自己填入,但是微软可能是做了这个修复补丁,不让发送的机器名为其他的值。如果各位找到了可以修改发送机器名的方法还望告知,我的邮件是:[email protected] ,谢谢!