2012-06-05 42 views
0

我想使用Windows.h中的CreateThread函數,但沒有包含在頭文件中的所有#defines和廢話。是否有某種方式可以導入(我認爲這就是它所稱的)只是從.dll或.lib中的函數? 測試失敗:提取特定的Win32函數

#pragma comment(lib,"Kernel32.lib") 
__declspec(dllimport) 
unsigned long 
__stdcall 
WaitForSingleObject(
    void* hHandle, 
    unsigned long dwMilliseconds 
    ); 


int main() 
{ 
    WaitForSingleObject(0,0); 
} 
+0

好奇,你爲什麼關心所有這些定義等?預處理器/編譯器爲你做了所有的辛苦工作,所以我不認爲你自己做得很好。另外,*如何*失敗了,你是否得到了具體的錯誤?是編譯器還是鏈接器錯誤? – BrendanMcK

回答

2

至少有兩個選項:

  1. 你並不需要包括頭。 CreateThread的定義不會改變。您可以將其聲明(以及它所依賴的聲明)從Windows頭文件複製到您自己的源文件中。

  2. 您可以圍繞使用的Windows API函數編寫包裝,然後使用Windows API的「pimpl」用法,這樣就不必在整個地方包含Windows.h和其他標頭。

在我看來,後一種選擇可能是優選的,因爲它是不容易出錯,更簡單,並提供了非標準的功能隔離,使其更容易端口的代碼。

+0

我試着做這樣的事情。當放在我的源代碼中時,它會導致無法解析的外部錯誤。但由於某種原因,當我複製並將其粘貼到舊定義在windows.h中的位置時,它起作用。關於windows.h有什麼特別的嗎? – Lauer

+0

在標題中搜索任何'#pragma comment';標題可能會指示鏈接器包含庫。或者,請檢查MSDN中哪些導入庫應用於缺少的函數,並將其添加到項目的鏈接器選項中。 –

+0

已經找不到任何。 Microsft說CreateThread在Kernel32.lib中。由於CreateThread的定義很長,我使用WaitForSingleObject作爲測試:查看源代碼的問題 – Lauer

3

是的,你可以動態加載DLL,得到函數的地址,然後調用它。雖然我不確定你的Windows.h問題是什麼。

LoadLibrary GetProcAddress

+1

任何使用過'Windows.h'的人都知道問題出在哪裏。 – Puppy

+1

曾嘗試使用名爲A :: CreateFile的方法獲得A類,然後注意到存在鏈接器錯誤,因爲windows.h中的#define將方法定義更名爲A :: CreateFileW或A :: CreateFileA? windows.h是一團糟。 –

+1

GetProcAddress位於WinBase.h中,它破壞了目的。 – Lauer

0

我想的DLL不具有預處理指令,因爲他們已經編譯,所以包括DLL不應該污染你的工作集。如果你想包含源文件(* .h文件),那麼你將需要編譯這些函數,這很可能取決於這些指令和其他廢話。

+1

如何在不包含頭文件的C++中包含dll? –

+0

啊,好點。 – whiterook6