випадку програму припиняє свою роботу (ніякі пастки винятків не допомагають) і, якщо воно виконується під Windows 95 або Windows 98, найчастіше потрібне перезавантаження операційної системи. Зрозуміло, що повернення покажчика стека в первинний стан повинен відбуватися після закінчення роботи методу. Але при цьому існують дві можливості - повернення покажчика на місце може робити як метод, що викликається по закінченні роботи, так і викликає метод після завершення роботи викликається методу. В принципі, в різних мовах програмування реалізуються обидві зазначені можливості - очищати стек можуть і викликаний, і викликає методи. Оскільки модуль пишеться на одній мові програмування, то ці проблеми приховані від програміста: очищення стека проводиться за специфічним для даної мови протоколу. Але якщо використовуються різні модулі, код для яких реалізований на різних мовах програмування, то виникають проблеми. Наприклад, в C + + стек очищається в методі, який викликав другий метод, після закінчення його роботи. У Delphi ж стек очищається в тому ж самому методі, де він використовується, перед закінченням його роботи. Якщо *. Exe-модуль, створений на мові C + +, викликає метод з DLL, створений на Delphi, то перед закінченням роботи методу в DLL стек буде очищений. Після цього управління передається модулю, реалізованому на C + +, який також спробує очистити стек, - така дія призведе до краху стека. p align="justify"> Крім цих можливостей, існує й інший спосіб, а саме: послідовність приміщення в стек параметрів методу. Припустимо, є метод, який використовує для роботи два параметри:
procedure DoSomething (N: integer; D: TDateTime);
Зазначений спосіб полягає в тому, що спочатку в стек може бути поміщена константа N, а потім D (зліва направо) або спочатку поміщається константа D, а потім N (справа наліво). Крім того, деякі мови програмування (зокрема, Delphi) частину параметрів методу взагалі не поміщають в стек, а передають їх через регістри процесора. До того ж у різних мовах програмування параметри можуть поміщатися в стек як зліва направо, так і справа наліво. Якщо вони були поміщені зліва направо, а метод, що викликається буде читати справа наліво, то вийде плутанина: в якості значення константи N викликається метод буде вважати значення правої половини константи D, а константу D він формуватиме з константи N і лівої половини D. p align="justify"> З цієї причини в будь-якій мові програмування передбачена можливість оголосити, який з методів - викликається чи викликає, буде очищати стек і в якій послідовності параметри методу поміщаються в стек. Таке оголошення називається угодою виклику (calling conversion). p align="justify"> Для методів, експонованих в DLL, рекомендується (але не обов'язково) використовувати те ж угоду виклику, що і в Windows API. Для 32-розрядних додатків Windows API методи реалізовані таким чином, що параметри поміщаються в стек справа наліво і стек очищає...