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

Printing PrintDlg函数(64位)-在调试器中工作,不工作时崩溃,printing,dialog,common-controls,Printing,Dialog,Common Controls,我正在将一些Win32代码移植到Win64。旧代码使用PrintDlg(),在所有版本的Windows(32位和64位)上都可以正常运行。新代码没有 如果我在我的Win64应用程序中设置了一个全零PRINTDLG结构,将“120”放在lsStructSize字段中,并调用PRINTDLG(),则不会显示任何对话框,应用程序将崩溃 但是,如果我在Visual Studio 2017 Pro中运行完全相同的图像,则每次对话框都会按预期运行 关于(a)为什么它在VS中工作,但在直接运行时崩溃?还有(b

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

如果我在我的Win64应用程序中设置了一个全零PRINTDLG结构,将“120”放在lsStructSize字段中,并调用PRINTDLG(),则不会显示任何对话框,应用程序将崩溃

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

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


Brian

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

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

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

在我的“WINAPI”宏中,只需要一行额外的代码——“MOV RSP,_OriginalRSP”——就足够了

谢谢你们的时间,伙计们

布莱恩