这是最简单的方法
否则的话要用NetBIOS调用
很麻烦的说
否则的话要用NetBIOS调用
很麻烦的说
解决方案 »
- 用vc++写一个outlook插件,读取usbkey的信息,是使用WM_DEVICECHANGE么?
- 我用spy++抓一个程序窗体的文字,总是取不到,不知是怎么回事?
- 如何将《CHM电子图书》链接到自己编的程序当中?
- 关于业务流程的控制,开发过工作流管理软件的.......
- 想问问,写这样的程序JAVA 和.NET是不是都要靠边站了?
- 如何在App类的InitInstance()中访问到我自己的formview中的变量?
- 捕获键盘按键消息,急急急
- 线程是否可以读取、修改全局变量?
- 怎样把视图中的文字拖来拖去?
- VC动态链接库问题
- 新浪的Smtp服务器是不是有问题?
- STL不能作为类成员吗?(BCB5)
在NT和2K下,如果Messenger服务已启动(一般是自动启动),其它机器通过NET SEND发过来的消息都会激活Messenger的对话框,显示出收到的消息。如果你真的想做一个聊天程序,当然不希望看到这个窗口,因此必须对消息进行截获,不让Messenger弹出窗口。
一般不能停止Messenger服务,否则网络更新可能会出问题。
// cncb.h -- defines the data type CNCB as a helper for CNetBIOS#include <nb30.h>
#pragma comment(lib,"netapi32.lib")
#define LANA_NUM 0
//#define MAXMACHINENAME 16
// compound structurestypedef struct ADAPTER_STATUS_BLOCK
{ADAPTER_STATUS asb_header;
NAME_BUFFER asb_Names[NCBNAMSZ];
} ADAPTER_STATUS_BLOCK, *PADAPTER_STATUS_BLOCK;typedef struct SESSION_INFO_BLOCK
{SESSION_HEADER sib_header;
SESSION_BUFFER sib_Names[NCBNAMSZ];
} SESSION_INFO_BLOCK, *PSESSION_INFO_BLOCK;typedef struct {
UCHAR Protocol[4]; // Contains 0xFF,'SMB'
UCHAR Command; // Command code
union {
struct {
UCHAR ErrorClass; // Error class
UCHAR Reserved; // Reserved for future use
USHORT Error; // Error code
} DosError;
ULONG Status; // 32-bit error code
} Status;
UCHAR Flags; // Flags
USHORT Flags2; // More flags
union {
USHORT Pad[6]; // Ensure this section is 12 bytes long
struct {
USHORT PidHigh; // High part of PID
ULONG Unused; // Not used
ULONG Unused2;
} Extra;
};
USHORT Tid; // Tree identifier
USHORT Pid; // Caller's process id
USHORT Uid; // Unauthenticated user id
USHORT Mid; // multiplex id
// UCHAR WordCount; // Count of parameter words
// USHORT ParameterWords[ WordCount ]; // The parameter words
// USHORT ByteCount; // Count of bytes
// UCHAR Buffer[ ByteCount ]; // The bytes
} SMB_HEADER;void MakeNetBIOSName(char * pszName, char * pszPaddedName, UCHAR Uni);class CNCB
{
private:
NCB m_NCB;
public:
// constructor
CNCB();
// helper function
void ClearNCB();
UCHAR GetLSN();
WORD GetLength();
void Fill(CNCB ncbSource);
UCHAR GetCommand();
// Name Management Services
UCHAR AddName(PSTR pName);
UCHAR AddGroupName(PSTR pName);
UCHAR DeleteName(PSTR pName);
UCHAR FindName();// Data Transfer Services
UCHAR Call(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO); // fill in parameters later;;;
UCHAR Listen(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO);
UCHAR Hangup(UCHAR wSessionNumber);
// Connectionless Data Transfer
UCHAR Cancel();
UCHAR Send(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength);
UCHAR SendNoAck();
UCHAR SendDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength);
UCHAR SendBroadcastDatagram();
UCHAR Receive(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength);
UCHAR ReceiveAny();
UCHAR ReceiveDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength);
UCHAR ReceiveBroadcastDatagram();
UCHAR ChainSend();
UCHAR ChainSendNoAck();// General Purpose Services
UCHAR Reset(UCHAR wSessions, UCHAR wNCBs);
UCHAR GetAdapterStatus(PSTR pName);
UCHAR GetSessionStatus(PSTR pName);
UCHAR EnumerateAdapters();
UCHAR StatusAlert();
UCHAR Action();
};
// cncb.cpp -- implements the data type CNCB as a helper for CNetBIOS
#include "stdafx.h"
#include "cncb.h"CNCB::CNCB()
{
};void CNCB::ClearNCB()
{memset((void *)&m_NCB,0,sizeof(NCB));
};UCHAR CNCB::GetLSN()
{ return m_NCB.ncb_lsn;
};WORD CNCB::GetLength()
{ return m_NCB.ncb_length;
};void CNCB::Fill(CNCB ncbSource)
{memcpy(&m_NCB,&ncbSource.m_NCB,sizeof(NCB));
};UCHAR CNCB::GetCommand()
{
return m_NCB.ncb_command;
};
/*********************************************************/
UCHAR CNCB::AddName(PSTR pName)
{ClearNCB();
m_NCB.ncb_command = NCBADDNAME;
m_NCB.ncb_lana_num = LANA_NUM;
strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::AddGroupName(PSTR pName)
{ClearNCB();
m_NCB.ncb_command = NCBADDGRNAME;
m_NCB.ncb_lana_num = LANA_NUM;
strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::DeleteName(PSTR pName)
{ClearNCB();
m_NCB.ncb_command = NCBDELNAME;
m_NCB.ncb_lana_num = LANA_NUM;
strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
return (Netbios(&m_NCB));
};/*********************************************************/
UCHAR CNCB::FindName()
{ return 0;};// Data Transfer Services
/*********************************************************/
UCHAR CNCB::Call(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO)
{ClearNCB();
strncpy((char *)&m_NCB.ncb_name,pWe,NCBNAMSZ);
strncpy((char *)&m_NCB.ncb_callname,pTheOther,NCBNAMSZ);
m_NCB.ncb_rto = wRecvTO;
m_NCB.ncb_sto = wSendTO;
m_NCB.ncb_command = NCBCALL;
return (Netbios(&m_NCB));
};/*********************************************************/
UCHAR CNCB::Listen(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO)
{ClearNCB();
strncpy((char *)&m_NCB.ncb_name,pWe,NCBNAMSZ);
strncpy((char *)&m_NCB.ncb_callname,pTheOther,NCBNAMSZ);
m_NCB.ncb_rto = (UCHAR)wRecvTO;
m_NCB.ncb_sto = (UCHAR)wSendTO;
m_NCB.ncb_command = NCBLISTEN;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::Hangup(UCHAR wSessionNumber)
{ClearNCB();
m_NCB.ncb_command = NCBHANGUP;
m_NCB.ncb_lsn = wSessionNumber;
return (Netbios(&m_NCB));
};
// Connectionless Data Transfer
/*********************************************************/
UCHAR CNCB::Cancel()
{
CNCB cbCanceller;
cbCanceller.ClearNCB();
cbCanceller.m_NCB.ncb_buffer = (unsigned char *)&m_NCB;
cbCanceller.m_NCB.ncb_length = sizeof(NCB);
cbCanceller.m_NCB.ncb_command = NCBCANCEL;
return (Netbios(&cbCanceller.m_NCB));};
/*********************************************************/
UCHAR CNCB::Send(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength)
{ClearNCB();
if (wLength > 0xffff) RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL);
m_NCB.ncb_command = NCBSEND;
m_NCB.ncb_lsn = wSessionNumber;
m_NCB.ncb_length = wLength;
m_NCB.ncb_buffer = (unsigned char *)lpPacket;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::SendNoAck()
{ return 0;};
/*********************************************************/
UCHAR CNCB::SendDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength)
{ClearNCB();
m_NCB.ncb_command = NCBDGSEND;
m_NCB.ncb_lsn = wSessionNumber;
m_NCB.ncb_length = wLength;
m_NCB.ncb_buffer = (unsigned char *)lpPacket;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::SendBroadcastDatagram()
{ return 0;};
/*********************************************************/
UCHAR CNCB::Receive(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength)
{ClearNCB();
m_NCB.ncb_command = NCBRECV;
m_NCB.ncb_lsn = wSessionNumber;
// do not hardcode that!!!
if (wLength > 0xffff) m_NCB.ncb_length = 0xffff; else
m_NCB.ncb_length = wLength;
m_NCB.ncb_buffer = (unsigned char *)lpPacket;
return (Netbios(&m_NCB));
};
UCHAR CNCB::ReceiveDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength)
{ClearNCB();
m_NCB.ncb_command = NCBDGRECV;
m_NCB.ncb_lsn = wSessionNumber;
m_NCB.ncb_length = wLength;
m_NCB.ncb_buffer = (unsigned char *)lpPacket;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::ReceiveBroadcastDatagram()
{ return 0;};
/*********************************************************/
UCHAR CNCB::ChainSend()
{ return 0;};
/*********************************************************/
UCHAR CNCB::ChainSendNoAck()
{ return 0;};// General Purpose Services
UCHAR CNCB::Reset(UCHAR wSessions, UCHAR wNCBs)
{ClearNCB();
m_NCB.ncb_command = NCBRESET;
m_NCB.ncb_lsn = wSessions;
m_NCB.ncb_num = wNCBs;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::GetAdapterStatus(PSTR pName)
{ClearNCB();
ADAPTER_STATUS_BLOCK asStatus;
memset(&asStatus,0,sizeof(ADAPTER_STATUS_BLOCK));
strncpy((char *)&m_NCB.ncb_callname,pName,NCBNAMSZ);
m_NCB.ncb_command = NCBASTAT;
m_NCB.ncb_lana_num = LANA_NUM;
m_NCB.ncb_length = sizeof(ADAPTER_STATUS_BLOCK);
m_NCB.ncb_buffer = (unsigned char *)&asStatus;
return (Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::GetSessionStatus(PSTR pName)
{ClearNCB();
SESSION_INFO_BLOCK sibSession;
memset(&sibSession,0,sizeof(SESSION_INFO_BLOCK));
strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
m_NCB.ncb_command = NCBSSTAT;
m_NCB.ncb_lana_num = LANA_NUM;
m_NCB.ncb_buffer = (unsigned char *)&sibSession;
m_NCB.ncb_length = sizeof(SESSION_INFO_BLOCK);
return(Netbios(&m_NCB));
};
/*********************************************************/
UCHAR CNCB::EnumerateAdapters()
{ return 0;};
/*********************************************************/
UCHAR CNCB::StatusAlert()
{ return 0;};
/*********************************************************/
UCHAR CNCB::Action()
{ return 0;};void MakeNetBIOSName(char * pszName, char * pszPaddedName, UCHAR Uni)
{
if (pszName) strcpy(pszPaddedName,pszName);
strupr(pszPaddedName);
unsigned int iLoop;
for (iLoop=strlen(pszPaddedName);iLoop<NCBNAMSZ;iLoop++)
pszPaddedName[iLoop]=' ';
pszPaddedName[NCBNAMSZ-1]=Uni;
};发消息:
CNCB::Call
CNCB::Send
CNCB::Hangup
收消息:
CNCB::AddName
CNCB::Listen
CNCB::GetLSN
CNCB::Send
CNCB::Hangup