2011-10-03 17 views
4

你好,我試圖用D打開一個窗口win32,我有一個小問題。當我調用CreateWindowA時,程序崩潰。如何使用win32在D中創建Windows?

這裏是我的代碼:

this.fenetrePrincipale = CreateWindowA(this.classeFenetre.lpszClassName, toStringz(title), WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, null, null, this.hInstance, null); 

有:

this.classeFenetre.lpszClassName = toStringz("classeF"); 
this.hInstance = GetModuleHandleA(null); 

string title = "test"; 

當我啓動的exe,程序崩潰,我已經有了:

進程以狀態終止-1073740791

on code :: blocks。

回答

11

錯誤代碼-1073740791(或0xc0000409)是由堆棧緩衝區溢出(而不是溢出,如在堆棧中用盡,但寫入堆棧中您不應寫入的地方)引起的。

您顯示的呼叫看起來沒問題。但是您沒有向我們展示課程註冊碼,更重要的是您註冊了WndProc。我不確定你如何在D中執行此操作,但是您的WndProc需要聲明爲__stdcall,以便它符合Windows假定的調用約定。這是一個常見的問題,導致CreateWindow崩潰。

1

是啊,這就是問題所在:

我沒有宣佈的WndProc的__stdcall 你做,在d是

extern (Windows) int windowRuntime(HWND window, UINT message, WPARAM wParam, LPARAM lParam) 

感謝您的幫助方式。

+4

請注意,這不是論壇,而是問答網站,因此您已發佈「答案」。如果您想對答案發表評論,請點擊下方的評論按鈕。如果答案是令人滿意的,請點擊複選標記接受答案。至於這個「答案」,你應該刪除它。歡迎! – GManNickG

0

我會建議使用gtkD或QTD代替Win32。這兩個小部件庫是成熟和強大的,但使用起來非常簡單。而且你也有跨平臺的支持。

+0

事實上,我的目標是從零開始創建2D API。 我不想創建像QT或GTK這樣的proffessional,更像sdl。 –

+0

爲什麼?這是否值得重新發明輪子?在這種情況下,還有一些其他GUI工具包,儘管它們還不成熟,但完全用D編寫。您可以從它們的源代碼中學習。 MSDN文檔非常有價值。 – Ethan

相關問題