我正在将应用程序和dll从32位迁移到64位。我发现从应用程序对dll的调用未正确传递参数。
下面是应用程序中的一个示例调用,应将123传递给dll例程:
unsigned short tmpId = 123;
SetDisExerciseId(tmpId);
在32位调试dll(从32位应用程序调用)时,我看到以下内容:
Value and registers window when calling using 32-bit.
但是当我尝试从64位应用程序调用到64位dll时,得到以下信息:
Value and registers window when calling using 64-bit.
我可以看到在32位版本的ECX寄存器和RCX寄存器中传递的值为0x007b(123),但是在以64位查看值时,可以看到exId的值不相同。它显示为0xebb0,很可能来自RDX或RDI寄存器。
从下面的链接https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2017#parameter-passing看来,该参数确实应该已经通过RCX寄存器传递了。
我真的很困惑为什么未传递正确的值。
您能提供的任何帮助将不胜感激。