答案:设置winmode=0
我是第一次使用 ctypes,因此在尝试真正实现它之前先玩了一下。但是,我无法使用 ctypes.CDLL()
加载我编译的 DLL,因为它会抛出 FileNotFoundError。
这是完整的错误信息:
FileNotFoundError:无法找到模块 'E:\absolute\path\to.dll' (或其依赖项之一)。请尝试使用带有构造函数语法的完整路径。
我确信该文件存在于该位置。
在查找过程中,有人建议我使用 Dependency Walker 来跟踪任何可能尚未编译的依赖项,但是当我使用它时,它只标记了 Windows API 的内容(根据 Google 的说法,这很正常? 我使用的是 Windows 10 系统),而没有标记其他内容。我认为这是有道理的,因为这是 C++ 代码的全部内容:
#include <string>;
#include <cstring>;
使用 namespace std;
extern "C" {
const char* formatIntegerMessage(int num) {
// 代码实现
}
}
下面是我尝试使用它的 python 代码
import ctypes
lib = ctypes.CDLL("C:/absolute/path/to.dll") # 抛出 FileNotFoundError
# 更多代码
我还尝试添加 from ctypes import *
并使用 ctypes.WinDLL()
代替 CDLL
,但每次都会抛出相同的错误。
我确信我犯了一个明显的错误,但我在网上找不到任何相关信息。如果能得到任何帮助,我将不胜感激!
您遇到的错误可能是由于 DLL 的名称中包含一个点 (.)。虽然您的文件资源管理器可能不会显示它,但 DLL 文件的完整名称可能包括一个扩展名,例如“to.dll.dll”。
尝试以下解决方案:
-
重命名 DLL 文件: 最简单的解决方案是重命名 DLL 文件,删除名称中的额外点。例如,将“to.dll”重命名为“todll.dll”。然后,更新 Python 代码以使用新的文件名。
-
指定完整的文件名(包括扩展名): 您可以尝试在 Python 代码中指定 DLL 文件的完整文件名,包括扩展名。例如:
lib = ctypes.CDLL("C:/absolute/path/to.dll.dll")
- 使用
os.path.abspath
获取绝对路径: 为了确保路径没有问题,您可以使用os.path.abspath
函数获取 DLL 文件的绝对路径:
import ctypes
import os
dll_path = os.path.abspath("C:/absolute/path/to.dll")
lib = ctypes.CDLL(dll_path)
如果这些方法都不起作用,请提供以下信息,以便我能够更好地帮助您:
- DLL 的完整文件名,包括扩展名。
- 您用来编译 DLL 的编译器和编译选项。
- 您的 Python 版本。