Chebmaster raised the point about shared memory and the fact that the application and the DLL will have their own memory managers... Technomage confirmed it... and the tests I've done also suggest its just a simple case of the left hand doesn't know what the right hand is doing once you start allocating memory on both sides of the boundary.

So I'm going to be forced to use a shared memory manager... which in itself isn't a huge deal providing both sides of boundary can cope. If they can, then I can forget about using pointers... I've just tested passing an object across the boundary using Borlands shared memory manager and it works a treat. Strings and all :-)