argv[0] doesn't always give the full path of the app, it can just give the exe name, e.g. when the application is simply started from the local directory. Also, on some platforms I think you can arbitrarily manipulate what gets put into argv[0], but I'm not too familiar with this.
(Edit: To clarify, it depends on the shell you're using, and not the C++ program itself, as far as I can tell)
argv[0] will give an arbitrary value set by the environment that doesn't necessarily have anything to do with the path to the current process' executable.
On Windows, GetModuleFileName() is the correct solution. I imagine there are equivalent functions on other platforms.