【问题标题】:Python ctypes: doesn't load dll as expected [duplicate]Python ctypes:没有按预期加载dll [重复]
【发布时间】:2020-05-30 05:24:13
【问题描述】:

我正在尝试在 Windows 10 (x64) 中的 python 中加载库。

用于生成测试库的cpp文件为:

extern "C" int check() {
  return(1);
}

然后我使用命令生成 dll(在 x64 Native Tools 命令提示符中):

cl /c mylib.cpp
link /dll /machine:x64 mylib.obj

生成文件 mylib.dll。 然后在python中,初始化显示如下字符串:

Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32

我运行以下命令:

import ctypes
lib=ctypes.CDLL("mylib.dll")
lib.check.restype=(ctypes.c_int,)

最后一个命令失败了,说不能识别check。 我还尝试了lib._check 并使用测试C 文件代替cpp,结果相同,还尝试使用ctypes.WinDLL 代替ctypes.CDLL

怎么了? Python 是 x64 以及库 mylib.dll...

如果我这样做:

ctypes.windll.msvcrt.getchar()

功能正常...这里我使用 MSVCRT 库,当我加载 ctypes 时会自动访问它。

我应该以不同的方式编译我的库吗?

【问题讨论】:

    标签: python c++ c ctypes


    【解决方案1】:

    您需要导出您的 API:

    extern "C" __declspec(dllexport) int check() {
      return 1;
    }
    

    另外lib.check.restype 不应该是一个元组。 .argtypes 接受一个元组:

    lib.check.argtypes = ()
    lib.check.restype = ctypes.c_int
    

    仅供参考,cl /LD mylib.cpp 将一步编译和链接 DLL。

    另外仅供参考,CDLLWinDLL 在 x64 上无关紧要,但分别对应于 x86 上的 __cdecl__stdcall 调用约定。 x64 只有一个调用约定,所以任何一个都可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 2011-02-28
      • 2022-12-02
      • 1970-01-01
      • 2018-12-23
      • 2014-12-17
      • 2012-11-01
      • 2011-12-01
      相关资源
      最近更新 更多