2011-11-04 66 views
1

我們正在生產針對Windows 7和XP的DLL。我們希望我們的DLL在DLL加載到Windows 7系統時使用較新的Vista線程池API,而不是在XP系統上加載該DLL。在XP中加載的DLL中使用新的Vista線程池API(在XP中不使用線程池代碼)

現在,我們嘗試編譯DLL以檢測操作系統的運行時間,以確保Vista系統從未在XP系統上使用過,但我們仍然無法在Windows XP系統上註冊我們的DLL,因爲缺少依賴關係kernel32.dll ...

有沒有辦法解決這個問題,而不是構建兩個獨立版本的DLL?

在此先感謝

回答

6

你爲什麼不使用調用LoadLibrary動態加載kernel32.dll中,然後使用GetProcAddress的,以確定是否需要Vista的線程池API函數可用?如果它們是,很好,如果它們不回退到舊的API函數。

E.g. (未經測試)

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:「延遲加載Kernel32.dll不被支持,這個DLL是延遲加載助手例程執行延遲加載所必需的。 ref:http://msdn.microsoft.com/en-us/library/yx1x886y.aspx – franmon

+1

他沒有說延遲加載。 –

+0

我想我不明白什麼延遲加載意味着...我認爲延遲加載和動態加載是相同的。你能告訴我這兩個概念之間有什麼區別嗎? – franmon