### 软硬件环境 * Windows 10 * anaconda3 with python 3.6.4 * visual studio 2015 ### Visual Studio编译dll 在需要抛出的方法前加入`__declspec(dllexport)`, 比如下面`C`代码 ```c __declspec(dllexport) unsigned int crc32( const unsigned char *s, unsigned int len) { unsigned int i; unsigned int crc32val=0xffffffff; printf("len==%d\n",len); for (i = 0; i < len; i ++) crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ ((crc32val >> 8)&0x00FFFFFF); return ~crc32val; } ``` 然后打开`VS X64`工具命令行提示符,进入到`C`源码目录,分别执行以下两条命令,第一条命令是生成目标文件`.obj`,第二天命令是链接目标文件,生成动态库。 ```bash cl /c crc.c link /dll crc.obj ``` 至此,`dll`文件就生成了,它就是我们需要的动态链接库。 ![](https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/python/win_ctype.png) ### python调用dll 这个跟`linux`下`python`调用`so`库是一样的,可以参考之前的文章 <https://blog.xugaoxiang.com/python/python3-call-dynamic.html>, 这里就不多说了。 ### 碰到的坑 调用时报错 ```bash File "client.py", line 35, in <module> data_crc = CRC.calcStrCRC(recv_buffer[20:], recv_buffer[8] - 14) File "D:\longjing\clientdemo\crc.py", line 33, in calcStrCRC handle = cdll.LoadLibrary('crc.dll') File "D:\tools\anaconda3\lib\ctypes\__init__.py", line 426, in LoadLibrary return self._dlltype(name) File "D:\tools\anaconda3\lib\ctypes\__init__.py", line 348, in __init__ self._handle = _dlopen(self._name, mode) OSError: [WinError 193] %1 不是有效的 Win32 应用程序。 ``` 确保`dll`是`64`位的,`python`也是`64`位的 ### 参考资料 * <http://catherineh.github.io/programming/2016/07/07/troubleshooting-windows-dll-imports-in-python>


Comments

comments powered by Disqus