关于易语言调用call宏call的 问题

JACOB的callsub如何调用excel的宏
[问题点数:40分,结帖人jimmyteal]
本版专家分:0
结帖率 87.5%
CSDN今日推荐
本版专家分:11942
本版专家分:0
本版专家分:11942
匿名用户不能发表回复!
其他相关推荐调用函数时,计算机常用栈来存储传递给函数的参数。
栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。
在参数传递中,有两个重要的问题必须要明确说明:
1. 当参数个数多于一个时,按照什么顺序把参数压入堆栈;
2. 函数调用后,由谁来把堆栈恢复原状。
在高级语言中,就是通过函数的调用方式来说明这两个问题的。常见的调用方式有:
naked call
下面就分别介绍这几种调用方式:
1. stdcall
stdcall调用方式又被称为Pascal调用方式。在Microsoft C++系列的C/C++编译器中,使用PASCAL宏,WINAPI宏和CALLBACK宏来指定函数的调用方式为stdcall。
stdcall调用方式的函数声明为:
int _stdcall function(int a, int b);
stdcall的调用方式意味着:
(1) 参数从右向左一次压入堆栈
(2) 由被调用函数自己来恢复堆栈
(3) 函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸
上面那个函数翻译成汇编语言将变成:
push b 先压入第二个参数
push a 再压入第一个参数
call function 调用函数
在编译时,此函数的名字被翻译为_function@8
cdecl调用方式又称为C调用方式,是C语言缺省的调用方式,它的语法为:
int function(int a, int b) // 不加修饰符就是C调用方式
int _cdecl function(int a, int b) // 明确指定用C调用方式
cdecl的调用方式决定了:
(1) 参数从右向左依次压入堆栈
(2) 由调用者恢复堆栈
(3) 函数名自动加前导下划线
由于是由调用者来恢复堆栈,因此C调用方式允许函数的参数个数是不固定的,这是C语言的一大特色。
此方式的函数被翻译为:
push b // 先压入第二个参数
push a // 在压入第一个参数
call funtion // 调用函数
add esp, 8 // 清理堆栈
在编译时,此方式的函数被翻译成:_function
3. fastcall
fastcall 按照名字上理解就可以知道,它是一种快速调用方式。此方式的函数的第一个和第二个DWORD参数通过ecx和edx传递,
后面的参数从右向左的顺序压入栈。
被调用函数清理堆栈。
函数名修个规则同stdcall
其声明语法为:
int fastcall function(int a, int b);
4. thiscall
thiscall 调用方式是唯一一种不能显示指定的修饰符。它是c++类成员函数缺省的调用方式。由于成员函数调用还有一个this指针,因此必须用这种特殊的调用方式。
thiscall调用方式意味着:
参数从右向左压入栈。
如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压入栈后被压入栈。
参数个数不定的,由调用者清理堆栈,否则由函数自己清理堆栈。
可以看到,对于参数个数固定的情况,它类似于stdcall,不定时则类似于cdecl。
5. naked call
是一种比较少见的调用方式,一般高级程序设计语言中不常见。
函数的声明调用方式和实际调用方式必须一致,必然编译器会产生混乱。
函数名字修改规则:
1. C编译时函数名修饰约定规则:
__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_function@8。
__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_function。
__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@function@8。
它们均不改变输出函数名中的字符大小写,这和PASCAL调用约定不同,PASCAL约定输出的函数名无任何修饰且全部大写。
2. C++编译时函数名修饰约定规则:
__stdcall调用约定:
(1)以“?”标识函数名的开始,后跟函数名;
(2)函数名后面以“@@YG”标识参数表的开始,后跟参数表;
(3)参数表以代号表示:
X--void ,
E--unsigned char,
F--short,
I--unsigned int,
K--unsigned long,
M--float,
N--double,
_N--bool,
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代
表一次重复;
(4)参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
(5)参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。
其格式为“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
void Test2() -----“?Test2@@YGXXZ”
__cdecl调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。
__fastcall调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YI”。
VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用。查看: 2462|回复: 5
如何在工作表中用CALL的形式调用宏,见附件,谢谢大家!
阅读权限20
在线时间 小时
大家好,如何在工作表中用CALL的形式调用程序,见附件,谢谢大家!
09:32 上传
点击文件名下载附件
19.96 KB, 下载次数: 32
阅读权限100
在线时间 小时
变量有使用区域的
楼主的这个要么用公共变量,或者过程带变量的
阅读权限100
在线时间 小时
Public tg As Range
Sub test()
Dim ws As Worksheet
On Error Resume Next
If tg.Column &= 2 And tg.Column &= 8 And Cells(tg.Row, &I&) = &OK& Then
Cells(tg.Row, 1).Select
ActiveWorkbook.Names.Add Name:=&ncolumn&, RefersToR1C1:=tg.Column
ActiveWorkbook.Names.Add Name:=&nRow&, RefersToR1C1:=tg.Row
Sub test1()
If tg.Column &= 2 And tg.Column &= 8 And Cells(tg.Row, &I&) = &OK& Then
Cells(tg.Row, 1).Select
ActiveWorkbook.Names.Add Name:=&ncolumn&, RefersToR1C1:=tg.Column
ActiveWorkbook.Names.Add Name:=&nRow&, RefersToR1C1:=tg.Row
阅读权限100
在线时间 小时
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set tg = Target
阅读权限100
在线时间 小时
看看附件内容是否满足需求吧
17:07 上传
点击文件名下载附件
20.38 KB, 下载次数: 71
阅读权限20
在线时间 小时
本帖最后由 dongwengui1984 于
10:36 编辑
看看附件内容是否满足需求吧
谢谢老师为我解答!THANK YOU VERY MUCH!就是要这样的效果
最新热点 /1
本活动是由微软(中国)有限公司发起,申请通过者可以得到Office 365企业级E3 试用账号,并享有全套Office 365客户端及云端高效、协作办公体验。 机会有限,先到先得!
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师个回答可以启动Excel,打开工作簿,并从VBScript文件中运行宏。将下面的代码复制到记事本中。更新“MyWorkbook.xls“和”迈宏“参数。用VBS扩展保存它并运行它。Option Explicit
On Error Resume Next
ExcelMacroExample
Sub ExcelMacroExample()
Dim xlBook
Set xlApp = CreateObject(&Excel.Application&)
Set xlBook = xlApp.Workbooks.Open(&C:\MyWorkbook.xls&, 0, True)
xlApp.Run &MyMacro&
xlApp.Quit
Set xlBook = Nothing
Set xlApp = Nothing
End Sub 运行宏的关键行是:XlApp.Run“MyMacro”最简单的方法是:1)从批处理文件中启动Excel,打开包含宏的工作簿:EXCEL.EXE /e &c:\YourWorkbook.xls&2)从工作簿的宏调用Workbook_Open事件,例如:Private Sub Workbook_Open()
Call MyMacro1
' Call your macro
ActiveWorkbook.Save
' Save the current workbook, bypassing the prompt
Application.Quit
' Quit Excel
End Sub现在,这将将控件返回到批处理文件以执行其他处理。扫描二维码扫描关注云+社区WINAPI宏与CALLBACK宏有什么用?又有什么区别?
[问题点数:50分,结帖人dkbrain]
本版专家分:939
结帖率 100%
CSDN今日推荐
本版专家分:191
本版专家分:8699
本版专家分:7874
本版专家分:60630
2011年10月 荣获微软MVP称号2010年10月 荣获微软MVP称号
2009年12月 VC/MFC大版内专家分月排行榜第一2009年11月 VC/MFC大版内专家分月排行榜第一2009年10月 VC/MFC大版内专家分月排行榜第一2009年9月 VC/MFC大版内专家分月排行榜第一
2009年8月 VC/MFC大版内专家分月排行榜第二
2010年1月 VC/MFC大版内专家分月排行榜第三
本版专家分:1971
2009年7月 Windows专区大版内专家分月排行榜第二2009年6月 Windows专区大版内专家分月排行榜第二2009年5月 Windows专区大版内专家分月排行榜第二
本版专家分:432084
2009年 总版技术专家分年内排行榜第二2005年 总版技术专家分年内排行榜第二
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2009年6月 总版技术专家分月排行榜第三2009年2月 总版技术专家分月排行榜第三2005年4月 总版技术专家分月排行榜第三2005年1月 总版技术专家分月排行榜第三
本版专家分:2625
本版专家分:5559
本版专家分:3754
本版专家分:119
本版专家分:3000
本版专家分:3000
本版专家分:784
本版专家分:17434
本版专家分:1058
本版专家分:1366
2011年3月 C/C++大版内专家分月排行榜第二
匿名用户不能发表回复!
其他相关推荐
“注释宏”是类似这样的宏: //}}AFX_MSG_MAP
VC注释宏是给类向导用的,若要使用类向导添加成员变量和成员函数,则要保留注释宏;否则,必须手动添加。 是用于vc编辑器自动生成代码定位用的如果你把它删了相应的classwizad就不能自动生成代码了 。 你添加消息响应的时候是不是发现源代码里多了些代码?那些代码为什么会在那里出现为什么不在别的文件里出现就是因为那里有注释宏它要将代码生成在相应注释宏之间 。 这个注释是让ClassWizard能够分辨出哪些代码是它生成的,哪些是你自己写的。你自己写
1.在字符串前加一个L作用。
如:L&我的字符串& 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
strlen(&asd&)
而strlen(L&asd&)
2._T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式。
1、内联函数在编译时展开,而宏在预编译时展开
2、在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
3、内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能。
4、宏不是函数,而inline是函数
5、宏在定义时要小心处理宏参数,一般用括号括起来,否则容易出现二义性。而内联函数不会出现二义性。
(1) 编译器处理方式不同
  define宏是在预处理阶段展开。
  const常量是编译运行阶段使用。
(2) 类型和安全检查不同
  define宏没有类型,不做任何类型检查,仅仅是展开。
  const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
lisp宏的理解
gdb调试宏、条件断点、命令行参数例子:#include &stdlib.h&
#include &stdio.h&
#define MACRO1(x) (++(x))
#define MACRO2(x) (MACRO1(x)+100)
#define MACRO3(x) (MACRO2(x)+200)
int main(void)
int a = 0;
一、C++中宏的作用
1、使用宏定义常量
示例:#define
MAXSIZE 200
#include&stdio.h&
#define M 20
int main()
int a = M;
int b = 20;
编译后变成以下代码
int a = 20;
int b = 20;
使用freemarker通常要把一些常用的html代码段封装成一个整体使用,这里就用到了freemarker的宏()
先上一段代码:
#include &stdafx.h&
#define s5(a)
Connect_##a
#define s(p)
void Connect_Test(const char* p)
cout && &this is Connect Test:& &&
在C++中,在使用宏的时候,建议使用do {} while(0)的写法

我要回帖

更多关于 调用call检测 的文章

 

随机推荐