尝试在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章