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

Reply via email to