Since you can't change the prototype in the C++ dll, then I'm assuming you didn't compile that dll and don't actually know how it was compiled.
So how do you know that the function was actually compiled with __stdcall ??
Just because you have a header file that says that, doesn't mean that that header file was the one that the dll was compiled with.
The "unbalanced" message pretty much means that you've mixed __stdcall and __cdecl or something like that. In one case the caller is supposed to clean up the stack, in the other the callee is supposed to. If you mix them up you end up with either neither caller or callee cleaning up the stack or both of them doing it -- in either case you'd get the unbalanced message.
See:
http://msdn.microsoft.com/en-us/library/984x0h58(v=VS.90).aspx[
^]
If __stdcall isn't working, then the most likely scenario is that the C++ dll was actually compiled with __cdecl semantics.
Try that first, if it doesn't work try the other calling conventions listed. It really is only going to be the calling convention attribute that is a problem, so find the one it was really compiled with via trial and error (or stop in the debugger and examine the object code and see what stack clean up the callee is actually doing).