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 に答える