0

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

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

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

关于 (a) 为什么它在 VS 中工作,但直接运行时崩溃的任何想法?和(b),我能做些什么来解决它?!

布赖恩

4

1 回答 1

0

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

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

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

我的“WINAPI”宏中的一行额外代码 - “MOV RSP,_OriginalRSP” - 就足够了。

谢谢你的时间,伙计们。

布赖恩

于 2018-08-27T16:08:23.427 回答