c_long
的大小和平臺有關:(32)位。python
64位windows
編譯出來的dll
若是和python
的版本不同,那麼就會出現下面的錯誤函數
當前是64
的,因此修改了以後就能夠了。this
#include<stdio.h> extern "C" void show() { printf("hello"); }
from ctypes import * handle = WinDLL("./test.dll") handle.show()
LoadLibrary
,進行加載。加載方式而形成調用方式不一樣。 此文章針對windows環境.net
若是成員方法使用了調用協議,那麼就會有一個this指針做爲隱式的第一個參數。指針
調用約定,32bit x86保護 edi,esi,ebp,ebx寄存器,使用fdx,eax對來處理返回值code
32bit和16bit的約束相同,參數從右往左進棧(這樣第一個參數就是棧頂元素),調用者清理參數。方法名前定義 _ 如 int Double(int a,int b){return a*b;}這裏默認是__cdecl,經過在前加修飾符 _ 表示調用約定爲 __cdeclblog
win32程序,除了可變參數函數外(可變函數遵循的是 __cdecl標準)以及一些使用 __fastcall的函數。 參數從右往左進棧,被調用者清理棧。方法名修飾 _funcname@n (n表示參數佔用的字節)get
前兩個參數被存入ECX和EDX寄存器中,其他的和__stdcall同樣從右往左進棧。而後調用者清理棧。方法名經過@funcname@n(n表示參數佔用字節,包括ECX和EDX中的)編譯器
第一個參數this被放入ECX寄存器中,其他的按照__stdcall約定從右往左進棧。即,被調用者清理棧, 方法名由C++編譯器經過額外的複雜的一種機制進行裝飾。這種是很是有必要的,由於C++方法重載,因此須要複雜的裝飾來進行知足不一樣的重載有不一樣的方法名。
聲明和定義的約定必定要相同。