Функция PrintDlg (64-разрядная) - работает в отладчике, аварийно завершает работу, если нет - PullRequest
0 голосов
/ 27 августа 2018

Я портирую код Win32 на Win64. Старый код использует PrintDlg () и отлично работает во всех версиях Windows (32- и 64-разрядных). Новый код не!

Если я установлю структуру PRINTDLG со всеми нулями в моем приложении Win64, поместив «120» в поле lStructSize и вызову PrintDlg (), диалоговое окно не отобразится, и приложение вылетит.

Однако, если я запускаю точно такое же изображение из Visual Studio 2017 Pro, диалоговое окно работает, как и ожидалось, каждый раз!

Есть мысли о том, (а) почему он работает в VS, но вылетает при запуске напрямую? И (б), какого черта я могу это исправить?!

Brian

1 Ответ

0 голосов
/ 27 августа 2018

Хотя я до сих пор не уверен, почему мой код работает в среде VS2017, а не в отдельном приложении, я нашел способ заставить мой код работать.

Это зависит от указателя стека, RSP: при входе в мое приложение (компилятор Prolog) я выделяю свой собственный большой изменяемый частный стек во время выполнения и устанавливаю RSP на его вершину.

Если я вызываю функцию PrintDlg () с RSP в моем личном стеке, это вызывает GPF. Если я сбрасываю его в исходный стек Windows, то функция работает как положено.

Одна дополнительная строка кода в моем макросе "WINAPI" - "MOV RSP, _OriginalRSP" - это все, что нужно.

Спасибо за ваше время, ребята.

Brian

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...