Я мигрирую приложение и DLL с 32-х бит на 64-х бит.Я обнаружил, что вызовы dll из приложения неправильно передают параметры.
Ниже приведен пример вызова приложения, где 123 должно быть передано подпрограмме dll:
unsigned short tmpId = 123;
SetDisExerciseId(tmpId);
При отладке dll в 32-битном режиме (вызов из 32-битного приложения) я вижу следующее:
Значение и окно регистров при вызове с использованием 32-битного.
но когда я пытаюсь вызвать из 64-битного приложения в 64-битный dll, я получаю следующее:
Значение и регистры окна при вызове с использованием 64-битного.
Я вижу, что значение 0x007b (123) передается в регистр ECX в 32-битной версии и в регистре RCX, но я вижу, что значение exId не одинаково при просмотре значения в 64-немного.Он выглядит как 0xebb0, который, скорее всего, поступает из регистров RDX или RDI.
По следующей ссылке https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2017#parameter-passing выясняется, что параметр действительно должен быть передан через регистр RCX..
Я действительно озадачен, почему правильное значение не передается.
Любая помощь, которую вы можете оказать, будет оценена.