前言 我们做打印小票的时候除了直接对端口发送指令的方式,还有就是调用打印机驱动打印的方式,在Delphi中想要用驱动打印的方式就可以用到TPrinter类 TPrinter类介绍 TPrinter类中封装了...结束一个成功打印的工作需要调用EndDoc过程。如果出现问题需要中断打印可以调用Abort方法。...调用BeginDoc可以初始化一个打印工作。如果打印工作被成功送入,应用程序将调用EndDoc方法结束打印。打印工作只有在调用EndDoc方法后才实际开始。...调用EndDoc方法将结束打印工作(并关闭当前打开的文体)。打印工作将在EndDoc方法调用结束后开始。在应用程序中调用EndDoc方法后,打印机开始打印。...不能直接调用TPrinter方法。TPrinter方法将由Printer函数自动调用。方法为打印机分配内存,并调用继承的构造方法。然后设置正确的驱动器、设备和端口.
1.把WSDL的URL地址放到了HTTPRIO的WSDLLocation参数中,然后选择service和port 2.最近一个项目用到了delphi调用C#写的web服务的功能。...先测试了N次都不成功,通过跟踪发现delphi根本没传过来任何值,通过查资料发现VS2005 默认是用的 SoapDocumentProtocol而Delphi 是使用的 SoapRpcProtocol...fs, 0, fs.Length); f.Close(); f = null; return 1; } catch { return 2; } } delphi...MyShowMessage('上传失败'); end; finally MyWSUpFile:=nil; end; except MyShowMessage('调用
调用动态库的两种方法 静态调用 这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中...动态调用 这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。...代码演示 我们先创建一个动态链接库名称为PosPayIntf,最近几章介绍Delphi技术的都是用这个动态库,因为正好因为项目要做一个对接第三方微信支付宝的动态库。 ?...---- 动态调用 今天我们主要说的还是动态调用,因为用动态调用的方法如果DLL不存在,或是入口函数有问题,我们都可以通过try except进行捕获,也不会影响主程序的使用。...调用的方式和静态调用一样 ? 最后用try finally来释放一下动态库 ? 这样就完成了,动态调用的方法不影响我们主程序的运行,只有在用到的时候才会调作它,推荐使用这个方法。
下面以主函数调用求和函数分析函数堆栈调用 带着以下一个问题来探索: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?...,首先我们必须具备的基础知识是几条简单的汇编指令和寄存器的功能和作用以及通常用的几个寄存器。...具备上边常用的intelx86汇编指令以及常用寄存器的功能。...现在回答最开始我们提出的几个题: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?从头开始还是从调用之后开始?...答: (1)形参的内存空间的开辟和清理是由调用方执行的。 (2)主函数调用函数后执行执行调用之后的代码,是因为调用方在进行调用的过程中,将下一行指令的地址压栈。
本篇介绍 本篇介绍下汇编中的外部函数和调用约定。...调用约定 调用约定(Calling Convertions)就是调用函数时传参和返回值的约定。不同的平台约定也不一样,比如linux和windows 就都有自己的一套调用约定。...当调用函数的时候,返回地址rip也会压栈,prologue中保存rbp也会压栈一次,这样如果需要通过rsp拿到第7个参数,就需要是rsp + 16。...third mov r8, fourth mov r9, fifth push 0 ; 16 byte align the stack,保证调用...在调用函数时,对于寄存器的保存也有一套约定,有的寄存器值需要caller保存,有的需要callee保存,具体如下: image.png image.png 关键信息如下: 对于callee save
函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等...这种调用方式规定函数调用者在将参数压入栈中后,再将控制权转移到被调用函数,被调用函数通过栈顶指针ESP来访问这些参数。函数返回时,由调用者程序负责将堆栈平衡清除。...使用汇编仿写数组传递方式,在main函数内我们动态开辟一块栈空间,并将数组元素依次排列在栈内,参数传递时通过lea eax,dword ptr [ ebp - 18h ]获取到数组栈地址空间,由于main...int) = ShowPrint; int Ret = pShowPrint(2, 4); printf("返回值 = %d \n", Ret); return 0; } 首先我们使用汇编仿写...ShowPrint函数以及该函数所对应的int(__stdcall *pShowPrint)(int, int)函数指针,看一下在汇编层面该如何实现这个功能。
今天,我们来通过反汇编看一下函数调用的过程(顺便学习下汇编),如下图,为一个函数调用的例子。主函数里面调用了test()函数。...[mmbnqe4jdu.png] 在X86环境下,进入调试模式,反汇编代码。...然后我们从主函数看起, [1hjrn6x5yu.png] 前面一些汇编代码都是编译器在调试模式下自动生成的调试信息代码,我们主要看画红线的两句代码。...[54ttnqunha.png] 调用test函数,汇编代码为call 00D7121C,很明显test函数的地址在00D7121C。...[asw60l7djz.png] 可以看出,一次函数调用过程,在底层居然做了这么多操作,而且函数调用会为每个函数调用分配栈空间,一旦调用结束之后,该栈空间便被回收掉。 完
ret:将eip的值返回到esp中 调用约定: fastcall 前两个参数放入ecx,edx,后面参数从右往左依次入栈,被调用者栈平衡 stdcall 参数从右往左依次入栈,被调用者栈平衡 thiscall...cdecl 参数从右往左依次入栈,调用者栈平衡;add esp,xxx:栈平衡 image.png 栈是每个线程都必须拥有的空间,是一个内存 char类型和short类型参数都是以4字节入栈存储的...,不够就补,但是printf中会提升到八个字节 不写调用约定默认是__cdecl调用约定 调用者:调用函数的函数
函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等...这种调用方式规定函数调用者在将参数压入栈中后,再将控制权转移到被调用函数,被调用函数通过栈顶指针ESP来访问这些参数。函数返回时,由调用者程序负责将堆栈平衡清除。...使用汇编仿写数组传递方式,在main函数内我们动态开辟一块栈空间,并将数组元素依次排列在栈内,参数传递时通过lea eax,dword ptr [ ebp - 18h ]获取到数组栈地址空间,由于main...) = ShowPrint; int Ret = pShowPrint(2, 4); printf("返回值 = %d \n", Ret); return 0;}首先我们使用汇编仿写ShowPrint...函数以及该函数所对应的int(__stdcall *pShowPrint)(int, int)函数指针,看一下在汇编层面该如何实现这个功能。
声明局部变量◆ 高级语言程序中,在单个过程中创建使用和销毁的变量我们称它为局部变量(local variable),局部变量是在程序运行时,由系统动态的在栈上开辟的,在内存中通常在基址指针(EBP)之下,尽管在汇编时不能给定默认值..., [test1.My_Dword] mov ax, [test1.My_Word] mov al, [test1.My_Byte] ret main ENDP END main 关于宏汇编...宏过程(Macro Procedure)是一个命名的语汇编语句块,一旦定义后,宏过程就可以在程序中被调用任意多次,调用宏过程的时候,宏内的语句块将替换到调用的位置,宏的本质是替换,但像极了子过程,宏可定义在源程序的任意位置...* ret main endp end main 过程小例子 整数求和: 通过使用汇编语言实现一个整数求和的小例子. .data String WORD 100h,200h,300h,400h...call DumpRegs ; 调用查询寄存器子过程 push 0 call ExitProcess main ENDP END main 汇编实现性能度量:
函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等...一般编译器实现调用调用约定无外乎以下这几种: CDECL:C/C++默认的调用约定,调用方平栈,不定参数的函数可以使用,参数通过堆栈传递....cdecl 调用者平栈: cdecl是C/C++默认调用约定,该调用方式在函数内不进行任何平衡参数操作,而是在退出函数后对esp执行加4操作,从而实现栈平衡。...如下一段汇编代码,我们找到当前ESP基地址。 可以看到,esp+18就是第一个传入参数,那么程序在编译时,其实已经算出来了。...参考文献:《C++反汇编与逆向分析技术揭秘》
在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。...为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。...在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。...C语言程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。...在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。
声明局部变量◆高级语言程序中,在单个过程中创建使用和销毁的变量我们称它为局部变量(local variable),局部变量是在程序运行时,由系统动态的在栈上开辟的,在内存中通常在基址指针(EBP)之下,尽管在汇编时不能给定默认值...codemain PROCmov eax, [test1.My_Dword]mov ax, [test1.My_Word]mov al, [test1.My_Byte]retmain ENDPEND main关于宏汇编宏过程...(Macro Procedure)是一个命名的语汇编语句块,一旦定义后,宏过程就可以在程序中被调用任意多次,调用宏过程的时候,宏内的语句块将替换到调用的位置,宏的本质是替换,但像极了子过程,宏可定义在源程序的任意位置...* retmain endpend main过程小例子整数求和: 通过使用汇编语言实现一个整数求和的小例子..dataString WORD 100h,200h,300h,400h,500h.codemain...call DumpRegs ; 调用查询寄存器子过程push 0call ExitProcessmain ENDPEND main汇编实现性能度量: 通过调用库函数,实现对指定代码执行的性能度量
本文提出一种通过逆向二进制文件的方式,通过反汇编的指令获取函数之间的调用关系。...对于普通函数而言,在汇编层面直接调用的使其所在的函数地址,ida所在的加载器会将这个调用的实际函数地址替换成对应的函数名称,如下图1所示: 图2 通过对逆向汇编的分析,C/C++代码中的函数调用在编译成二进制之后...,逆向成汇编语言,从普通函数的角度观察,调用函数的指令有两类:一类是call指令。...如图2所示: 图3 汇编角度而言,普通函数的调用是最常用的一种形式,也最容易解析。...让我们一起看看一个有虚函数调用的函数的汇编实现: 图8 从上图可以很明白的知道,为什么虚函数父调用的关系缺失了,因为在汇编中这其实是一个地址的调用,要建立寄存器与具体虚表的关系是很困难的(或许本身就不可为
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; ...在x86的系统中,%eax寄存器在进行系统调用前储存系统调用号。另外,由于六个及以上参数的系统调用并不多见,因此一般使用%ebx、%ecx、%edx、%esi和%edi依次存放前五个参数。...当调用结束后,函数的返回值存放在%eax中。...下面,我们将改写fork.c,直接嵌入汇编语言进行系统调用: #include #include int main() { pid_t fpid; ...而内核基本只与系统调用打交道;当然,我们也可以直接使用系统调用写程序,但势必会降低程序的可移植性。至于APIs如何进行系统调用,那就是Glibc等标准制定者的事了。
} {$ENDIF} function testfn():PansiChar;cdecl; external name _PU+'testfn'; {$ASMMODE att} //开asm内联汇编...These can’t be used in Delphi. Delphi requires OMF formatted object files....To import the object file in Delphi, you should now copy the object file to the directory with your Delphi...The Delphi unit will have to provide them....The first four functions are simple, and can be coded in one line of Delphi code, since Delphi has similar
RTTI是Delphi的组件能够融合到IDE中的关键。它在IDE中不仅仅是一个纯学术的过程。 由于对象都是从TObject继承下来的,因此,对象都包含一个指向它们的RTTI的指针以及几个内建的方法。...第一个地方是DELPHI的IDE,这在前面已提到过。通过RTTI,IDE就会知道你正在使用的对象和组件的任何事情。实际上,不只是RTTI,但为了这个讨论,我们只谈RTTI方面。...在观看此例子之时,建议你看看typinfo.pas中的内容(DELPHI安装目录下/source/rtl/common/TypInfo.pas); 下面的例子主要分为两部分,界面上半部分,主要演示通过rtti
提示:本文意在使用汇编的语言给大家介绍函数调用中栈区上的过程变化,加深我们对于代码底层的理解,由于不同的编译器使用下,可能造成一些差异,但这并不影响我们对于知识原理的掌握,所以本文不必过多纠结细节处的变化...call指令是调用子程序,后面紧跟的应该是子程序名或者过程名。...8个字节的位置,正好跳过了我们为形参x y开辟的栈帧空间,此时也就是销毁了形参x y 读到这里我们今天的学习就结束了,我们讲解了Add函数在汇编角度下是如何被调用的?...我们会在调用函数前进行函数参数的内容,进行一个压栈操作,当进入到被调用函数内部的时候,我们会通过指针的偏移量找到函数参数,并对其进行操作。...我们会通过汇编语言中的call指令,先将其下一条指令的IP压栈到我们的栈帧空间当中,并且指向call指令,会进入到被调用函数的汇编代码当中,进行被调用函数的汇编指令 并且我们函数调用结束后,通过ret指令能够回到上一层函数中
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, G...
先上相关资源的下载吧: python4delphi: 主页: http://code.google.com/p/python4delphi/ 下载: svn checkout http://python4delphi.googlecode.com.../svn/trunk/ python4delphi-read-only 现在已支持到XE2....这样,我们就完成了Delphi传递参数到Python,Python执行完毕后将结果再返回给Delphi的演示.好了,我们可以好好利用Python,将它很好地嵌入到Delphi中了....有,可以像COM一样来调用Python模块的变量和函数,这看起来好像能更酷一些 :-) 感谢samson,是他的一篇文章使我学习到了这个方法,并且很热心地给予了指教!...def SayHello(s): return 'Hello,'+s 上面是简单的示例,有变量和函数,我们看看在Delphi中怎样来调用.