I found the solution myself.
The problem on W8.1 was that the verb open
was not registered to the application so it used different default verb. So if the ShellExecute
call is replaced with:
HINSTANCE hinst = ShellExecuteW(NULL, NULL, L"C:\\path\\to\\file.pps", NULL, NULL, SW_SHOWNORMAL);
Then the system looks for a default verb which may or may not be open
(usually is), so by not using this verb explicitly it leaves this decision to the system.