On Aug 11, 2013, at 4:32 PM, Damien Kick <dkick@shoretel.com> wrote:

Yeah, so far I've been having very good luck with Asio and 0MQ on POSIX.  But I'm still stuck on Windows :(  The code that I was able to get to compile is not happy at runtime.

int main()
{
   zmq::context_t zenv(1);
   zmq::socket_t zocket(zenv, ZMQ_PUSH);
   SOCKET zfd;
   std::size_t zfd_size = sizeof(zfd);
   zocket.getsockopt(ZMQ_FD, &zfd, &zfd_size);
   boost::asio::windows::stream_handle::native_handle_type
       zfd_native(&zfd);
   boost::asio::io_service ios;
   boost::asio::windows::stream_handle io(ios, zfd_native);
}


Stepping line-by-line in the debugger for Visual Studio 2010, when I get to the line attempting to create the windows::stream_handle, I get

Unhandled exception at 0x77b815de in test-zee-zmq-socket.exe: Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x00c1fc7c..

And so there obviously must be more to creating a windows::stream_handle than this but I'm still quite in the dark as to what that might be.  The stack trace I'm getting doesn't help me much, either, but I am also am quite ignorant about most things Windows.

  ntdll.dll!77b815de() 
  [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
  ntdll.dll!77b815de() 
  ntdll.dll!77b7014e() 
  KernelBase.dll!7608c41f() 
> msvcr100d.dll!_nh_malloc_dbg_impl(unsigned int nSize=8, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x00c1fb0c)  Line 239 + 0x19 bytes C++
  msvcr100d.dll!_nh_malloc_dbg(unsigned int nSize=8, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0)  Line 302 + 0x1d bytes C++
  msvcr100d.dll!malloc(unsigned int nSize=12712804)  Line 56 + 0x15 bytes C++
  00c1fb64()
  00cc8220()


I've also tried

int main()
{
   zmq::context_t zenv(1);
   zmq::socket_t zocket(zenv, ZMQ_PUSH);
   SOCKET zfd;
   std::size_t zfd_size = sizeof(zfd);
   zocket.getsockopt(ZMQ_FD, &zfd, &zfd_size);
   boost::asio::io_service ios;
   boost::asio::windows::stream_handle io(ios, GetStdHandle(zfd));
}

Which also compiles but then I'm still getting the same exception at runtime.  And so apparently a SOCKET is not the same as a HANDLE (?), even though <http://msdn.microsoft.com/en-us/library/windows/desktop/ms741476(v=vs.85).aspx> tells me that 

The WPUCreateSocketHandle function creates a new socket handle.

Syntax

SOCKET WPUCreateSocketHandle(
  _In_   DWORD dwCatalogEntryId,
  _In_   DWORD_PTR dwContext,
  _Out_  LPINT lpErrno
);

<sigh/> It's so annoying because I have this feeling that there is probably just one stupid little conversion function that I need to be calling but it continues to elude me :(



This e-mail and any attachments are confidential. If it is not intended for you, please notify the sender, and please erase and ignore the contents.