各位高手 NetMessageBufferSend 怎么不能用了? 我用 NetMessageBufferSend 发送信使时,在有的机器上可以使用,但是在有的机器上怎么也不能使用,但是用 Net send 是可以的,请教各位高手,这是什么原因? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windows 2000,xp把那个服务关闭了 服务里边有个Message服务,打开就可以发送了运行:net send 127.0.0.1 hello world! 上面两位,我是在 Net send 可以使用的情况下的,也就是 Messager 服务已经打开了 我用的是 Win2000 Server 和 XP 做的试验,以前是可以的,后来也不知道是怎么搞的就不行了,一直到现在用户给我反应,我才发现了这个问题。 可是我明明可以用 Net send 发送的,并且我用 MsgSend 2.51 发送也是可以的,真不知道是怎么回事! NetMessageBufferSend ,是什么东东?bug?? 没有用过,我直接是用net send...,那是个软件吗?还是命令啊,我学习学习 是一个 Windows NT 以后系统的一个 API 函数,你可以用这个在网上查一下 是不是对与不同系统传递参数不同啊?我回去看看了,现在手头没有msdn 在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+up2procedure 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;}//-------------------------------------------------------- ////////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 10NETRESOURCE 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);} 我之前也碰到你这种问题,后来查出原因在于两台机上的 NetAPI32.dll 这两个文件版本不一致,后来把我机上的文件发布到那台机上,问题解决。 wychero(高天) :我的情况不仅是不能发送到其他的机器上,连我自己的机器都不能发……汗! 谢谢上面各位的参与,我现在找到了原因,是因为我在填 From 机器名的时候允许用户自己填入,但是微软可能是做了这个修复补丁,不让发送的机器名为其他的值。如果各位找到了可以修改发送机器名的方法还望告知,我的邮件是:[email protected] ,谢谢! 求dll里面的变量问题. 请教一个问题,关于webbrowser和idhttp 100分,問一個水晶報表的小問題 一个非常好的专业电脑电子书库 自定以大小打印问题,(98,win2000)都可以用 Image 和 Paintbox delphi怎樣打開水晶報表 Delphi中如何创建控件数组 我装了win98,win2k.winxp之后我的win2k起不来了,我重装了一下,winxp又起不来了,怎么解决这个问题 如何在delphi中实现窗体图标缩小到任务栏中 DBExpress和DBGrid不能同时使用? d6中用什么连接INTERBASE数据库哟?连接本机和网络上的数据库有没有区别啊?
运行:net send 127.0.0.1 hello world!
可以使用这样的方法发送消息:(写的有些麻烦了),我的意思是,换一种方
法发送看看行不行?早上刚好有空,就抓紧写了一下,希望对你有帮助.
实在不行,你去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;
}
//--------------------------------------------------------
{
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);
}