【问题标题】:How do I create Windows in D with win32?如何使用 win32 在 D 中创建 Windows?
【发布时间】:2011-11-29 22:33:34
【问题描述】:

您好,我正在尝试在 D 中打开一个带有 win32 的窗口,但遇到了一个小问题。当我调用 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 状态终止

关于代码::块。

【问题讨论】:

    标签: winapi d win32gui


    【解决方案1】:

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

    您显示的呼叫看起来不错。但是您没有向我们展示班级注册码,更重要的是,您注册的WndProc。我不确定你是如何在 D 中做到这一点的,但是你的 WndProc 需要声明为 __stdcall,以便它与 Windows 假定的调用约定相匹配。这是导致CreateWindow 崩溃的常见问题。

    【讨论】:

      【解决方案2】:

      是的,这就是问题所在:

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

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

      感谢您的帮助。

      【讨论】:

      • 请注意,这不是一个论坛,而是一个问答网站,因此您发布了一个“答案”。如果您想对某个答案发表评论,请单击其下方的评论按钮。如果答案令人满意,请单击复选标记接受。至于这个“答案”,你应该删除它。欢迎!
      【解决方案3】:

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

      【讨论】:

      • 事实上,我的目标是从无到有创建一个 2D API。我不想创建像 QT 或 GTK 这样的专业,更像是 sdl。
      • 为什么?重新发明轮子值得吗?在这种情况下,还有一些其他的 GUI 工具包,虽然还不成熟,但完全是用 D 语言编写的。你可以从他们的源代码中学习。而且 MSDN 文档非常有价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多