VS2005 プロジェクトで GetFileInformationByHandleEx ルーチンを使用しています。当時、この関数は FileExtd.h と FileExtd.lib で利用でき、手動でダウンロードする必要がありました。プロジェクトを VS2010 に移行したいのですが、新しい SDK に同梱されている FileExtd.lib があることがわかりました。
VS2010 では GetFileInformationByHandleEx が winbase.h で宣言されていますが、WindowXP との互換性を維持するために、ルーチン定義を無効にするより低い値 (NTDDI_WINXP など) で _WIN32_WINNT を宣言する必要がありました。そうしないと、kernel32.dll に静的にリンクされます (ルーチンは WinXP では使用できません)。したがって、解決策は、古い FileExtd.h を VS2010 バージョンの FileExtd.lib と組み合わせて使用することだと思います。しかし、そうすると、次のリンク エラーが発生します。
1>fileextd.lib(fileextd.obj) : error LNK2019: unresolved external symbol __imp__RtlSetLastWin32Error@4 referenced in function _BaseSetLastNTError@4
1>fileextd.lib(fileextd.obj) : error LNK2019: unresolved external symbol __imp__NtWaitForSingleObject@12 referenced in function _GetFileInformationByHandleEx@16
winbase.h からの宣言を維持し、kernel32.lib の前に FileExtd.lib を宣言しようとしましたが、それでも kernel32.dll にリンクしています。
また、他のバージョンの Visual Studio でコンパイルされたライブラリを組み合わせても問題ありませんか? 私のVS2010プロジェクトでFileExtd.libの場合、VS2005バージョンを使用しているため、これを求めています。コンパイルして完全に正常に動作します。