我在dll中用注册了一个网络消息,同样的方法在vc中,应用程序就可以得到这个消息。
但在delphi中却得不到。
dll中的代码如下:
#define WM_SOCK_MSG (WM_USER + 200)
.....BOOL CMulticastSocket::JoinGroup(HWND hWnd,char *GroupIP, UINT nGroupPort, UINT nTTL, BOOL bLoopback)
{
WORD wVersionRequested;
WSADATA wsaData;
int avc;
return TRUE; // add on 20050808
wVersionRequested = MAKEWORD(2,2);
//初始化
avc = WSAStartup(wVersionRequested,&wsaData);
if(avc != 0)
{
// AfxMessageBox("不能加载Windows套接字动态链接库,MB_OK");
return FALSE;
}
//检测版本
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
// AfxMessageBox("WinSock DLL不支持2.0版本");
WSACleanup();
return FALSE;
}
//创建一个套接字
Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,
(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED
| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
if(Sock == INVALID_SOCKET)
{
// AfxMessageBox("创建套接字失败!");
closesocket(Sock);
WSACleanup();
return FALSE;
}
bFlag = TRUE;//设置套接字选项,使套接字为可重用端口地址
if (setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag))<0)
return FALSE; //将套接字绑定到用户指定端口及默认的接口
memset(&Local,0,sizeof(Local));
Local.sin_family = AF_INET;
Local.sin_port = htons((USHORT)nGroupPort);
Local.sin_addr.s_addr= htonl(INADDR_ANY);
// Local.sin_addr.s_addr = inet_addr("192.168.0.119"); if(bind(Sock,(struct sockaddr FAR *)&Local,sizeof(Local)) == SOCKET_ERROR)
return FALSE; //设置多播数据报传播范围(生存时间TTL
if( WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&nTTL,sizeof(int),
NULL,0,&cbRet,NULL,NULL) == SOCKET_ERROR )
return FALSE; //设置多播返回(LOOKBACK)
BOOL nLoopBack=bLoopback;
if( WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),
NULL,0,&cbRet,NULL,NULL) == SOCKET_ERROR)
return FALSE; memset(&Remote,0,sizeof(Remote));
Remote.sin_family=AF_INET;
Remote.sin_addr.s_addr=inet_addr(GroupIP);
Remote.sin_port=htons(nGroupPort); //加入到指定的多播组,并指定为既作为发送者又作为接收者(JL_BOTH)
SockM = WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),
NULL,NULL,NULL,NULL,JL_BOTH);
if(SockM == INVALID_SOCKET)
{
//AfxMessageBox("加入多播组失败!");
closesocket(SockM);
WSACleanup();
return FALSE;
} if(WSAAsyncSelect(Sock,hWnd,WM_SOCK_MSG,FD_READ) == SOCKET_ERROR ) //注册网络消息及其网络事件
{
// AfxMessageBox("注册网络消息失败!");
return FALSE;
}
bJoin=TRUE;
// return TRUE;
}在delphi中响应网络消息:
代码如下:
const
WM_SOCK_MSG = WM_USER + 200;
.....
调用dll中的函数:
VGA_ServerJoinGroup(frmMain.Handle,pchar('235.5.6.7'),5000,4,true);private
procedure HandleData(var aMsg: TMessage); message WM_SOCK_MSG;
procedure TfrmMain.HandleData(var aMsg: TMessage);
begin
showmessage('收到消息');
end;
请高手指教。
但在delphi中却得不到。
dll中的代码如下:
#define WM_SOCK_MSG (WM_USER + 200)
.....BOOL CMulticastSocket::JoinGroup(HWND hWnd,char *GroupIP, UINT nGroupPort, UINT nTTL, BOOL bLoopback)
{
WORD wVersionRequested;
WSADATA wsaData;
int avc;
return TRUE; // add on 20050808
wVersionRequested = MAKEWORD(2,2);
//初始化
avc = WSAStartup(wVersionRequested,&wsaData);
if(avc != 0)
{
// AfxMessageBox("不能加载Windows套接字动态链接库,MB_OK");
return FALSE;
}
//检测版本
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
// AfxMessageBox("WinSock DLL不支持2.0版本");
WSACleanup();
return FALSE;
}
//创建一个套接字
Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,
(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED
| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
if(Sock == INVALID_SOCKET)
{
// AfxMessageBox("创建套接字失败!");
closesocket(Sock);
WSACleanup();
return FALSE;
}
bFlag = TRUE;//设置套接字选项,使套接字为可重用端口地址
if (setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag))<0)
return FALSE; //将套接字绑定到用户指定端口及默认的接口
memset(&Local,0,sizeof(Local));
Local.sin_family = AF_INET;
Local.sin_port = htons((USHORT)nGroupPort);
Local.sin_addr.s_addr= htonl(INADDR_ANY);
// Local.sin_addr.s_addr = inet_addr("192.168.0.119"); if(bind(Sock,(struct sockaddr FAR *)&Local,sizeof(Local)) == SOCKET_ERROR)
return FALSE; //设置多播数据报传播范围(生存时间TTL
if( WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&nTTL,sizeof(int),
NULL,0,&cbRet,NULL,NULL) == SOCKET_ERROR )
return FALSE; //设置多播返回(LOOKBACK)
BOOL nLoopBack=bLoopback;
if( WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),
NULL,0,&cbRet,NULL,NULL) == SOCKET_ERROR)
return FALSE; memset(&Remote,0,sizeof(Remote));
Remote.sin_family=AF_INET;
Remote.sin_addr.s_addr=inet_addr(GroupIP);
Remote.sin_port=htons(nGroupPort); //加入到指定的多播组,并指定为既作为发送者又作为接收者(JL_BOTH)
SockM = WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),
NULL,NULL,NULL,NULL,JL_BOTH);
if(SockM == INVALID_SOCKET)
{
//AfxMessageBox("加入多播组失败!");
closesocket(SockM);
WSACleanup();
return FALSE;
} if(WSAAsyncSelect(Sock,hWnd,WM_SOCK_MSG,FD_READ) == SOCKET_ERROR ) //注册网络消息及其网络事件
{
// AfxMessageBox("注册网络消息失败!");
return FALSE;
}
bJoin=TRUE;
// return TRUE;
}在delphi中响应网络消息:
代码如下:
const
WM_SOCK_MSG = WM_USER + 200;
.....
调用dll中的函数:
VGA_ServerJoinGroup(frmMain.Handle,pchar('235.5.6.7'),5000,4,true);private
procedure HandleData(var aMsg: TMessage); message WM_SOCK_MSG;
procedure TfrmMain.HandleData(var aMsg: TMessage);
begin
showmessage('收到消息');
end;
请高手指教。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货