After 1.5 days of struggling with DLL and async model I decided to share some experience. What I needed is DLL with several functions interacting via sockets with a remote app. They must send request messages, receive responces, process them and return as out parameters. Function call must be blocking to avoid bugs in the host app. So at first I simply tried MessageLoop inside the function call. But - it's running in the main thread's (i.e. thread in host app which called the function) context - so it processed all the windows messages to host app like Application.ProcessMessages does. Interesting side effect but not usable in my case. Second thing is that I wanted all sockets to be created only on demand so I couldn't use its MessageLoop method as I couldn't tell which socket currently exists. So I came up to additional thread with its own message loop. But how could I achieve synchronization between calling functions and thread methods? Events? They increased complicateness much. So I had a nice idea: SendMessage. It blocks the calling thread while processing is done in the context of the window owner. Awesome! I've done all the stuff and everything seemed good and working when I faced with DLLMain. In my previous version I used some init stuff with no troubles so I thought some additional method calls would be OK. Unfortunately DLLMain appeared to be a very tricky thing: you can't call methods from other DLLs from there (incl GetProcAddress) as they could have not been loaded yet, and no sync methods too. But I used them widely to ensure resource cleanup on DLL unload. This resulted in deadlock and overall app hang when unloading DLL. I revised the situation but found only one way: provide special Start/Finish methods for init/cleanup. Not a good variant in my case but at least something. But the strangest thing is that deadlocks kept happening even when I explicitly call Finish before FreeLibrary (btw Finish executes all its commands without errors)! So I finally got tired of all this stuff and returned to my own simple blocking sockets - for DLL and in my case this seems much more applicable. Anyway I decided to share my experience - maybe it'll make a little help to someone (I really loved that method with SendMessage; things also must be working with explicit Start/Finish procedures but they don't and I have no wish to investigate why).
Here's demo project I created for testing. It uses OverbyteIcsTcpSrv.exe launched on localhost as a server: http://uploadbox.com/files/7466a54787/ P.S. I examined ICS DLL demo but it closes the connection every time - it's not an option for me. -- Anton -- To unsubscribe or change your settings for TWSocket mailing list please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be