1. 加載動態連接庫

  1. c_long的大小和平臺有關:(32)位。python

  2. 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

__cdecl

32bit和16bit的約束相同,參數從右往左進棧(這樣第一個參數就是棧頂元素),調用者清理參數。方法名前定義 _ 如 int Double(int a,int b){return a*b;}這裏默認是__cdecl,經過在前加修飾符 _ 表示調用約定爲 __cdeclblog

__stdcall

win32程序,除了可變參數函數外(可變函數遵循的是 __cdecl標準)以及一些使用 __fastcall的函數。 參數從右往左進棧,被調用者清理棧。方法名修飾 _funcname@n (n表示參數佔用的字節)get

__fastcall

前兩個參數被存入ECX和EDX寄存器中,其他的和__stdcall同樣從右往左進棧。而後調用者清理棧。方法名經過@funcname@n(n表示參數佔用字節,包括ECX和EDX中的)編譯器

thiscall

第一個參數this被放入ECX寄存器中,其他的按照__stdcall約定從右往左進棧。即,被調用者清理棧, 方法名由C++編譯器經過額外的複雜的一種機制進行裝飾。這種是很是有必要的,由於C++方法重載,因此須要複雜的裝飾來進行知足不一樣的重載有不一樣的方法名。

聲明和定義的約定必定要相同。

相關文章
相關標籤/搜索