Another thing you could do is to pass a reference to the Execute function like this:
void Execute(char **result, int resultLength, char *, char *, ...);
You would need to allocate memory for the result before the call and then free it yourself when done from within DLL1.
If you don't know the length of the result before the call to Execute, you could do the same thing Microsoft does with their libraries, and pass in NULL to Execute the first time. Execute would fill in the resultLength for you and then you could allocate your memory accordingly.
I do this a lot myself.