我在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;
请高手指教。