Platform SDKによればGetLongPathName()がWindows 98/2000以降では使用可能で,
NT/95ではNewAPIs.hをインクルードすることで使えるようになるとあります.
NewApis.hではGetLongPathName()を関数ポインタに置き換えて,OSのバージョンによってKernel32の関数かエミュレーション関数かを設定するようになっています.
今ある関数は全部やめてそれをそのまま使う方が間違いも起きず良いのではと思います.
ちなみにNewApis.hを見ると,Shellを介する手法は同じですがSetLastErrorとかより忠実にエミュレーションしている感じです.
最初は判定関数を呼ぶようにポインタをセットしておき,初回呼び出し時にOSの判定を行ってポインタを書き換えるという手法は他にも応用できるかも.
---
以上を入れたのがブリーフケースのGetLongPathName.diffです.
注意: 古いSDKだとNewAPIs.hにバグがあってコンパイルエラーになります.
Probe_GetLongPathName()の
DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
のDWORDがBOOLになっています.