【问题标题】:PrintDlg Function (64-bit) - Works in Debugger, Crashes when NotPrintDlg 函数(64 位) - 在调试器中工作,不工作时崩溃
【发布时间】:2018-08-27 13:59:22
【问题描述】:

我正在将一些 Win32 代码移植到 Win64。旧代码使用 PrintDlg(),并且在所有版本的 Windows(32 位和 64 位)上运行良好。新代码没有!

如果我在我的 Win64 应用程序中设置全零 PRINTDLG 结构,在 lStructSize 字段中放置“120”,然后调用 PrintDlg(),则不会显示任何对话框,并且应用程序崩溃。

但是,如果我在 Visual Studio 2017 Pro 中运行完全相同的图像,则对话框每次都按预期工作!

关于 (a) 为什么它在 VS 中工作,但直接运行时崩溃?还有 (b),我到底能做些什么来解决它?!

布赖恩

【问题讨论】:

    标签: printing dialog common-controls


    【解决方案1】:

    虽然我仍然不确定为什么我的代码可以在 VS2017 环境中工作,但不能在独立应用程序中工作,但我已经找到了让我的代码工作的方法。

    这取决于堆栈指针,RSP:在进入我的应用程序(Prolog 编译器)时,我分配我自己的、大型的、运行时可更改的私有堆栈,并将 RSP 设置为其顶部。

    如果我在私有堆栈中使用 RSP 调用 PrintDlg() 函数,则会导致 GPF。如果我将其重置为原始 Windows 堆栈,则该函数将按预期工作。

    只需要在我的“WINAPI”宏中添加一行代码 - “MOV RSP,_OriginalRSP” - 即可。

    感谢您的宝贵时间,伙计们。

    布赖恩

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 2012-04-17
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多