10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonでCのライブラリを使う方法

Last updated at Posted at 2017-04-15

#Pythonのctypesモジュールについて
##1. ctypesの使い方
 まずはモジュールのインポートの仕方。

howToImport.py
from ctypes import *

 次に、Cのライブラリの動的リンクと関数の使い方。

howToLoadLib.py
msvcrt=CDLL("C\\WINDOWS\\System32\\msvcrt.dll")
str="On Python!!"
msvcrt.printf("Hello World : %s",str)

ちなみに、動的リンクのメソッドはいくつかあって、CDLL(),windll(),oledllなどなど。
全くの初心者なので、あてずっぽうだがおそらくOSによって使い分けたりするのかな、、、?

ちなみに、gets()などの入力の関数も普通に使える。あと、動的リンクのところは、

howToLoad_2.py
msvcrt=cdll.msvcrt

でもいけるそうだ。(ていうかむしろこっちの方が一般的なのかな、、、?)

これも詳しくは知らないがおそらくは環境依存で標準のライブラリのディレクトリにある場合に使えるのかな、、、?
こっちなら絶対パスを書かなくても普通にできる。

##2. ctypesではCの型が使える!
 Pythonでは一般的に変数に型を指定しなくてもよいが、C言語だと変数に型を指定しなくてはならない。
 そして、C言語の型はPythonにはないので、ctypesが用意してくれている!
例えば、

howToHensu.py
str=c_char_p("AAA")
hensu.c
char *str="AAA"

こんな感じの二つのプログラムはおそらく同じ内容だと思われる。
細かいところは知らないが、たぶんやっていることは同じ。
今のはほんの一例で、char,int,short,long,double,float,void *などなどたくさんある。

ちなみにC言語の参照渡しがしたい場合は、byref()というメソッドを使う。
例えば、関数の引数にポインタを渡したい場合、myfunc(byref(pointer))のように使うことができる。この場合pointerはただの変数。

それと、変数だけでなく、構造体や共用体を使うこともできる。

howToStruct.py
class Test(Structure):
_fields_=[
("testInt",c_int),
("testChar",c_char),
]

こんな感じで構造体も作れる。(共用体は勉強不足で使いどころがまだよくわかっていないため、省きます)

##参考
 ちなみに今回の話は「リバースエンジニアリング~Pythonによるバイナリ解析技法~」という本を買って読み始めたので書いてみました。
 まだまだ読み始めたばかりなので、もう少し読んだらまたアップしてみたいと思います!
URL : リバースエンジニアリング~Pythonによるバイナリ解析技法~

ちなみに、今回Qiita初めてなので温かい目で見ていただけると嬉しいです、、、w
自分は完全初心者の高校生なので、間違ってるところなど指摘していただけると勉強になるのでとても助かります!

10
12
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?