尝试在 python 中正确加载和使用 dll 文件

Posted

技术标签:

【中文标题】尝试在 python 中正确加载和使用 dll 文件【英文标题】:Trying to load and use a dll file in python properly 【发布时间】:2018-06-14 18:23:52 【问题描述】:

我正在尝试在 python 中加载和使用 dll。我一直在尝试使用windows-kill,但我对 C++ 知之甚少。我能够在 Visual Studio 中很好地编译它,并且 exe 文件工作正常,但我想弄清楚如何用 Python 加载 dll,这样我就可以学习如何加载我最终可能想要使用的其他 dll。 到目前为止,这是我想出的代码。我不确定它是否需要 SIGINT 或数字作为值,因为命令行使用 -SIGINT 但我一直在尝试两者。

lib = ctypes.CDLL('windows-kill-library.dll')
libOpen = getattr(lib, "?sendSignal@WindowsKillLibrary@@YAXKK@Z")
libOpen.argtypes = [wintypes.DWORD, wintypes.DWORD]
val = 'SIGINT'
# val = 0
l = libOpen(9844, val)
print(l)

使用 SIGINT 作为 val 我得到错误:

ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type

并使用一个数字作为我得到的值:

OSError: [WinError -529697949] Windows Error 0xe06d7363

我知道 argtypes 一定是错误的,但我一直在尝试很多不同的东西并得到相同的错误。

这是未修饰的名称:

void WindowsKillLibrary::sendSignal(unsigned long,unsigned long)

我已经尝试使用 ctypes.c_ulong 和其他一些作为 argtypes 但仍然得到相同的错误。

在 Visual Studio 中,当我将鼠标悬停在以下 2 行中的 DWORD 上时:

DWORD signal_type;
DWORD signal_pid;

如果有帮助,它会显示“typedef unsigned long DWORD”。

这里也是用法示例,可以找到here

/// <summary>
/// Sends the signal.
/// </summary>
/// <param name="signal_pid">The signal target process id.</param>
/// <param name="signal_type">The signal type.</param>
void sendSignal(DWORD signal_pid, DWORD signal_type);

有谁知道我怎样才能做到这一点?谢谢。

【问题讨论】:

【参考方案1】:

您需要一个 DLL,因为 Windows 没有本机 signal 工具,因此该库正在模拟 POSIX signal 功能。 POSIX SIGINT 是数值 2,这对于 DWORD 来说是一个完美的值。常量 2 可以方便地通过 signal.SIGINT.value 获得。

【讨论】:

是的,尽管OSError: [WinError -529697949] Windows Error 0xe06d7363,但我一直收到此错误。我想我做错了。在我上面的代码中,当我认为它应该是 ctypes.WinDLL 时,我有 ctypes.CDLL 但无论哪种方式我都会遇到相同的错误。在我弄清楚如何正确地做之前,我将不得不继续搞砸它。

以上是关于尝试在 python 中正确加载和使用 dll 文件的主要内容,如果未能解决你的问题,请参考以下文章

python27.dll在哪儿

无法在 python 中加载 c++ DLL

ImportError:在 vscode 中使用导入 syft 导入 lib 时 DLL 加载失败

goland,cgo加载32位DLL遇到的问题

如何在 Java 中从 C DLL 加载和使用结构和函数?

c++动态加载dll报错