Как мне создать Windows в D с win32? - PullRequest
4 голосов
/ 03 октября 2011

Здравствуйте, я пытаюсь открыть окно с win32 в D, и у меня есть небольшая проблема. Программа вылетает, когда я вызываю CreateWindowA.

Вот мой код:

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

по коду :: блоки.

Ответы [ 3 ]

11 голосов
/ 03 октября 2011

Код ошибки -1073740791 (или 0xc0000409) вызван переполнением буфера стека (не переполнением, как при исчерпании стека, а записью в место в стеке, в которое вы не должны писать).

Вызов, который вы показали, выглядит хорошо.Но вы не показали нам регистрационный код класса и, что более важно, WndProc, который вы зарегистрировали.Я не уверен, как вы делаете это в D, но ваш WndProc должен быть объявлен __stdcall, чтобы он соответствовал соглашению о вызовах, принятому Windows.Это распространенная проблема, которая вызывает сбои на CreateWindow.

1 голос
/ 04 октября 2011

Да, это была проблема:

Я не объявил WndProc как __stdcall, как вы делаете это в D:

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

спасибо за вашу помощь.

0 голосов
/ 07 октября 2011

Я бы предложил использовать gtkD или QTD вместо Win32. Две библиотеки виджетов являются зрелыми и мощными, но очень простыми в использовании. И у вас есть кроссплатформенная поддержка.

...