2011-11-04 7 views
1

Windows 7とXPの両方をターゲットとするDLLを生成しています。 DLLがWindows 7システムにロードされていて、XPシステムにロードされていないときにDLLが新しいVistaスレッドプールAPIを使用するようにします。新しいVistaスレッドプールAPIを使用して、XPでもロードされているDLL(XPではスレッドプールコード)でロードされているDLL

今、VistaのAPIがXPシステムで使用されていないことを確認するために、OSのランタイム検出でDLLをコンパイルしようとしましたが、Windows XPシステムにDLLを登録できません。 kernel32.dll ...

2つの別バージョンのDLLをビルドする以外に方法がありますか?事前

答えて

6

おかげで、なぜあなたは、動的にLoadLibrary関数を使用してKERNEL32.DLLをロードし、必要VistaのスレッドプールAPI関数が利用可能かどうかを決定するためのGetProcAddressを使用していませんか?それらが古いAPI関数にフォールバックしていないかどうかは問題ありません。

など。

typedef PTP_WAIT (WINAPI *FnCreateThreadpoolWait) (PTP_WAIT_CALLBACK,PVOID, 
                PTP_CALLBACK_ENVIRON); 
HMODULE hLibrary; 
FnCreateThreadpoolWait pFn; 

hLibrary = ::LoadLibrary ("kernel32.dll"); 
pFn = (FnCreateThreadpoolWait) ::GetProcAddress (hLibrary,"CreateThreadpoolWait"); 
if (pFn == NULL) // Vista API not available 
    ..... 
+0

MSDNから: "Delay loading Kernel32.dllはサポートされていません。このDLLは、遅延ロードヘルパールーチンが遅延読み込みを実行するために必要です。" ref:http://msdn.microsoft.com/en-us/library/yx1x886y.aspx – franmon

+1

彼は遅延ロードを言っていませんでした。 –

+0

私は遅延ロードが何を意味するのかを正しく理解していないと思います...遅延ロードと動的ロードは同じだと思いました。これら2つの概念の違いは何ですか? – franmon

関連する問題