软硬件环境

  • Windows 10
  • anaconda3 with python 3.6.4
  • visual studio 2015

Visual Studio编译dll

在需要抛出的方法前加入__declspec(dllexport), 比如下面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,第二天命令是链接目标文件,生成动态库。

cl /c crc.c
link /dll crc.obj

至此,dll文件就生成了,它就是我们需要的动态链接库。

python调用dll

这个跟linuxpython调用so库是一样的,可以参考之前的文章 https://blog.xugaoxiang.com/python/python3-call-dynamic.html, 这里就不多说了。

碰到的坑

调用时报错

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 应用程序。

确保dll64位的,python也是64位的

参考资料


Comments

comments powered by Disqus