今天小编要和大家分享的是嵌入式技术相关信息,接下来我将从cdll和windll有什么不同,tiobe 2 月编程语言排行榜:python 逼近 c,groovy 重回 top20这几个方面来介绍。
嵌入式技术相关技术文章cdll和windll有什么不同
Python要想调用C语言写的动态连接库。不仅要兼容C接口的调用习惯,还须要兼容C语言的数据类型。幸运的是ctypes库已经做了这双方面的工作。以便调用动态连接库是很方便的。在Hello World的程序里,这行代码编写例如以下:
MessageBox = windll.user32.MessageBoxW
从这行代码的简洁程度来看。是很优美的。这样的优美是因为ctypes库在背后做了许多的工作。比方windll事实上是一个比較复杂的对象。在ctypes库里,它提供了三个easy载入动态连接库的对象:cdll、windll和oledll。通过訪问这三个对象的属性,就能够调用动态连接库的函数了。
当中cdll主要用来载入C语言调用方式(cdecl)。windll主要用来载入WIN32调用方式(stdcall),而oledll使用WIN32调用方式(stdcall)且返回值是Windows里返回的HRESULT值。假设你曾经没有学习过编程,肯定没有办法区分cdecl和stdcall,就算学习过编程,假设没有写过跨不同库之间的调用,也未必知道。因为在眼下IDE的开发环境下,已经所有隐藏这些的细节。
但在跨语言方面调用时,就不能忽略这样的细节了。那么你或许问为什么会出现这两种调用方式,不是同一个动态连接库吗?对于这个问题。问得好。
要回答这个问题,得从发明C语言那时候说起。
在70年代。美国人丹尼斯·里奇发明了C语言。而且使用C语言编写UNIX,由此他就成为了C语言之父和UNIX操作系统之父。因为UNIX操作系统很高效,改动起来也很方便,是得益于使用了C语言来编写。
随着UNIX操作系统的推广,C语言也变成了一个流行的语言。
要让UNIX变得高效率。那么C语言的设计上,就要着眼于高效的设计。
在函数调用这方面的设计,就体现了这一点。在C语言的函数调用时。须要传送多个參数。
这些參数的传送是能够通过寄存器或者栈来传送。那你或许问为什么不仅仅使用寄存器这一种方式呢?因为函数调用的參数比較多。比方达到5个。
而且在那时候的CPU的寄存器很少,也满足不了这个要求。不像眼下ARM或MIPS的CPU,寄存器比較多。多达13个之多。这时所有使用寄存器来传送參数是基本能够解决这个问题了。在当时的环境之下,设计的C语言的编译器都是按栈的方式来传递函数调用的參数,这样不但能够解决寄存器少的问题,也能够解决另外一个问题。就是能够动态地传递參数的个数。