はい、存在しないDLLエクスポートを参照するアプリケーションは読み込まれません。
OSバージョンに基づいて異なるパスを使用するようにコードを追加すると、存在しない関数への参照が残っているため、あまり役に立ちません。
代わりに、実行時に参照を解決する必要があります。
遅延ロードインポート(/DELAYLOAD
リンカフラグ付き)ですが、コアシステムDLL(kernel32など)ではサポートされていないと思います。
LoadLibrary
およびGetProcAddress
のいずれかを使用します。コードはこのようなものですが、実際には、関数を呼び出すたびにではなく、アプリの起動時に一度ルックアップを実行します。
// Declare type of pointer to CancelIoEx function
typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
// Load module; won't fail because it's already imported
HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
// Look up function address
CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
// Do something with it
if (pCancelIoEx)
{
// Function exists so call it
pCancelIoEx(hMyFile, pMyOverlapped);
}
else
{
// Function doesn't exist
}
出典
2012-01-26 18:40:52
arx
[遅延ロードするDLL]の可能複製(http://stackoverflow.com/questions/1388388/遅延ロードdll) –
@ GregHewgillでは、この場合遅延ロードは適切ではありません(動的ロードは)。それ以外にも、#1はカバーされていないので、これは正確な複製ではないと信じていますし、#2でどのOSが動作しているかを検出する方法も明確ではありません。 – Gili
OSを検出する方法は、特定のOSを検出するのではなく、単にDLLをロードしようとします。バージョン検出ではなく、機能の検出が必要です。この機能については、こちらのドキュメントで説明しています。http://msdn.microsoft.com/en-us/library/151kt790.aspx –