如何使用 win32 在 D 中创建 Windows?

发布于 2024-12-08 03:13:38 字数 587 浏览 0 评论 0原文

你好,我正在尝试在 D 中使用 win32 打开一个窗口,但遇到了一些问题。当我调用 CreateWindowA 时,程序崩溃了。

这是我的代码:

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

with:

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

string title = "test";

我启动exe时,程序崩溃了,我得到了:

进程终止,状态为-1073740791

进程在 code::blocks 上

Hello I'm trying to open a window with win32 in D, and I've got a little problem. The program crashes when I call CreateWindowA.

Here is my code :

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

with:

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

and

string title = "test";

When I launch the exe, the program crashes and I've got:

Process terminated with status -1073740791

on code::blocks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

请你别敷衍 2024-12-15 03:13:38

错误代码-1073740791(或0xc0000409)是由堆栈缓冲区溢出引起的(不是溢出,如耗尽堆栈,而是写入堆栈中不应该写入的位置)。

您显示的通话看起来没问题。但您没有向我们展示类注册代码,更重要的是,您注册的 WndProc 。我不确定你如何在 D 中执行此操作,但是你的 WndProc 需要声明 __stdcall,以便它符合 Windows 假定的调用约定。这是导致 CreateWindow 崩溃的常见问题。

The error code -1073740791 (or 0xc0000409) is caused by a stack buffer overrun (not overflow, as in running out of stack, but writing to a place in stack where you are not supposed to write to).

The call that you've shown is looks OK. But you didn't show us the class registration code, and more importantly, the WndProc you register. I am not sure how you do it in D, but your WndProc needs to be declared __stdcall, so that it matches the calling convention assumed by Windows. This is a common problem that causes crashes on CreateWindow.

如日中天 2024-12-15 03:13:38

是的,这就是问题所在:

我没有将 WndProc 声明为 __stdcall
你在 D 中这样做的方式是

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

感谢你的帮助。

Yeah that was the problem :

I didn't declared the WndProc as __stdcall
the way you do that in D is

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

thanks for your help.

冷︶言冷语的世界 2024-12-15 03:13:38

我建议使用 gtkD 或 QTD 而不是 Win32。这两个小部件库成熟且功能强大,但使用起来非常简单。而且您还拥有跨平台支持。

I would suggest using gtkD or QTD instead of Win32. The two widget libraries are mature and powerful, yet very simple to use. And you have cross-platform support as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文