If lpMsgBuf is already a pointer to a T-string and if the API expects the pointer to point directly to a T-string then you shouldn't use any cast at all. In other words if the data type is already correct then it's a good idea not to use unnecessary casts. The reason is that overuse of casts can blind you to bugs at the same time as the casts shut up the compiler.
If lpMsgBuf is already a pointer to a T-string and if the API expects a pointer to pointer to a T-string but the API expects that pointer to pointer to be cast into type pointer to T-string (and the API will cast it back when using it), then you're doing it right.
If lpMsgBuf is a pointer to something else (of correct type) and the API expects a pointer to pointer to your type but the API expects these casting games, then you're doing it right.
If lpMsgBuf is a pointer to T-string and if the API expects a pointer to T-string, then by your use of the & operator you're constructing a pointer to pointer to T-string which the API doesn't expect, and by your use of a cast you're telling the compiler to turn that pointer to pointer into the type pointer to T-string even though the value still points to a pointer. So you successfully shut up the compiler but you still deliver garbage results to you or your customers.
So, without more details of which MSDN page is telling you to create a pointer to pointer and play casting games for which API, we can't guess whether you're doing it right, or whether you misread MSDN, or whether MSDN is telling you to write bad code.
Now, if the cast is actually right, then the choice of which syntax to use is dependent on your style in the rest of your program.