64位只有一种调用约定stdcall
procedure TForm2.Button1Click(Sender: TObject);
function EnumWindowsProc(Ahwnd: hwnd; AlParam: lParam): Boolean; stdcall;
begin
ShowMessage('hwnd:' + IntToStr(Ahwnd));
ShowMessage('lParam' + IntToStr(AlParam));
Result := True;
end;
begin
EnumChildWindows(0, @EnumWindowsProc, 123);
end;
代码就是上面这点,选择编译32位平台,123会被传送到LParam里,选择编译64位平台123会被传送到hwnd里,这是怎么回事?
IDE是XE6,是我不会用吗?
----------------------------------------------
function EnumWindowsProc(Ahwnd: hwnd; AlParam: lParam): Boolean; stdcall;
begin
ShowMessage('hwnd:' + IntToStr(Ahwnd));
ShowMessage('lParam' + IntToStr(AlParam));
Result := True;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
EnumChildWindows(0, @EnumWindowsProc, 123);
end;
这样既可.
因为你如果要用嵌套函数的话编译出来的和外边的函数是不同的.
嵌套函数编译后编译器会多给一个参数作为第一个参数.这个参数保存的是父函数的栈底.当父函数调用这个嵌套函数的时候32位会塞ebp,64位会塞rbp作为第一个参数进来.
之所以32位表现似乎是没问题,因为你是stdcall,32位的时候是用栈传递参数,那么当
EnumChildWindows调用到你的函数时,你的函数取的是栈顶的三个值,刚好后两个就是Ahwnd,AlParam.
而64位只有一种调用约定stdcall,而stdcall的参数是rcx,rdx,r8,r9传递前四个参数,后面用栈传.EnumChildWindows调用你的函数的时候只给了rcx,rdx两个值.而你的函数则认为应该是rcx,rdx,r8三个参数.那么你的123被EnumChildWindows当成第二个参数放在rdx中.而你的回调函数则认为自己有三个参数,rcx是编译器给的父函数的栈底,rdx是Ahwnd.
基本就是上面的情况.
----------------------
64位只有一种调用约定stdcall的更多相关文章
- 宏WINAPI和几种调用约定
在VC SDK的WinDef.h中,宏WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall.这些调用约定会对我们的代码产生什么样的影响?让我 ...
- 64位系统VBS调用32位COM组件
64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- 64位进程调用32位dll的解决方法
64位进程调用32位dll的解决方法 最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/ ...
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- Wow64(32位进程)注入DLL到64位进程
转载自: https://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/ 向其他进程注入DLL通常的做法是通过调用CreateR ...
- 用VC进行64位编程
用VC进行64位编程 分类: C/C++2014-04-30 15:14 532人阅读 评论(0) 收藏 举报 本文转自:http://www.usidcbbs.com/read-htm-tid-52 ...
- x86 x64下调用约定浅析
x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C+ ...
- [转]C#程序无法在64位系统上运行之.NET编译的目标平台
今天将编译的C#的exe拷贝到测试机上(Win7_64bit),一运行就挂了,提示“stop working”,一开始怀疑测试机上没有安装.net framework框架,追究半天原来是编译的目标平台 ...
随机推荐
- POJ 2823 线段树 Or 单调队列
时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> ...
- 使用MALTAB标定实践记录
记录一下整个相机的标定矫正过程,希望能够帮助到刚学习标定的童鞋们- 首先下载matlab calibration toolbox,百度搜索第一条就是了(http://www.vision.caltec ...
- SQLServer2008 在where条件中使用CASE WHEN
create table #temp( id int identity(1,1), name varchar(20), startYear int, startMonth in ...
- NuGet 下载dll
PM> Install-Package DotNetCore.CAP PM> Install-Package xxxdll
- css属性代码大全总结(一)
一 CSS文字属性: color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; /*文字大小*/ ...
- HDU_1969_二分
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- javaee 用Buffered进行对象的写入和读取
package Zjshuchu; import java.io.Serializable; public class Dog implements Serializable{ private ...
- Codeforces Round #548 (Div. 2) C. Edgy Trees
You are given a tree (a connected undirected graph without cycles) of
- [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
传送门 Description 给出 n 个点和 n−1 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模. Input 第一行包含一个正整数 N(N& ...
- FusionCharts,双折线图和双柱状图
一个电商项目中,用到了"双柱状图",对比 当前库存和累计库存. 网上找了好几个贴子,才找到具体用法. 代码整理下,以备不时之需. 效果图-双折线图 效果图-双柱状图 <%@ ...