PrintDlg函数(64位)-在调试器中工作,不运行时崩溃

时间:2018-08-27 13:59:22

标签: printing dialog common-controls

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

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

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

关于(a)为什么在VS中起作用,但是直接运行时会崩溃的想法?而且(b),我该怎么做才能解决该问题?!

布莱恩

1 个答案:

答案 0 :(得分:0)

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

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

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

仅需要我的“ WINAPI”宏中的另一行代码-“ MOV RSP,_OriginalRSP”。

伙计,谢谢您的时间。

布莱恩