六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 34|回复: 0

如何用 C++ 为 Python 写 dll

[复制链接]

升级  58%

112

主题

112

主题

112

主题

举人

Rank: 3Rank: 3

积分
374
 楼主| 发表于 2013-1-15 02:26:45 | 显示全部楼层 |阅读模式
1. 先新建一个名为 hello.cpp 的 C++ 源文件:
#include <stdio.h>#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int __stdcall hello(){    printf("Hello world!\n");    return 0;} 
2. 编译成 dll 文件:

cl /LD hello.cpp 
注意, 这里的参数是 /LD, 而不是 /DL。


3. 编写一个名为 hello.py 的 python 文件:

# coding: utf-8import osimport ctypesCUR_PATH = os.path.dirname(__file__)if __name__ == '__main__':    print 'starting...'    dll = ctypes.WinDLL(os.path.join(CUR_PATH, 'hello.dll'))    dll.hello() 

4. 输出为:
 
starting...Hello world! 

需要注意的地方:
1. C++ 的 dll 中的接口函数必须以 extern "C" __declspec(dllexport) 为前缀, C 的以 __declspec(dllexport) 为前缀。
否则会报错:
 
Traceback (most recent call last):  File "hello.py", line 12, in <module>    dll.hello()  File "C:\Python25\lib\ctypes\__init__.py", line 361, in __getattr__    func = self.__getitem__(name)  File "C:\Python25\lib\ctypes\__init__.py", line 366, in __getitem__    func = self._FuncPtr((name_or_ordinal, self))AttributeError: function 'hello' not found 

2. 是使用 ctypes.CDLL 还是 ctypes.WinDLL 呢?
反正我是分不清,所以在 dll 中的接口函数中显式地加上了 __stdcall. 似乎一个是 caller 清栈,另外一个是 callee 清。

MSDN 中关于 __stdcall, __cdecl 的介绍:
__cdecl:
http://msdn.microsoft.com/en-us/library/zkwh89ks(VS.80).aspx
This is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention.

__stdcall:
http://msdn.microsoft.com/en-us/library/zxk0tw93(VS.71).aspx
The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl.

参考文档:
1. 《How to write a DLL/SO in C/C++ for Python》
http://wolfprojects.altervista.org/dllforpyinc.php

2. 《Python调用windows下DLL详解 - ctypes库的使用》
http://blog.csdn.net/magictong/archive/2008/10/14/3075478.aspx
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表