使用 ctypes.WinDLL() 的问题

Issues using ctypes.WinDLL()

我正在尝试让频谱分析仪程序示例正常工作,但它在查找模块时遇到问题。这是我收到的错误

Traceback (most recent call last):
  File "C:\Users\user\Documents\Programs\Python_program_example.py", line 10, in <module>
    rsa300 = ctypes.WinDLL("C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")
  File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found

DLL 存在并且 os.path.exists() 使用该路径打印 true 所以我不确定问题出在哪里。有谁知道这有什么问题?

RSA300API.DLL可能在文件夹中有依赖,所以在使用它之前,使用os.chdir设置工作目录,例如:

import os

os.chdir(r'C:\Tektronix\RSA306 API\lib\x64')
rsa300 = ctypes.WinDLL(r"C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")

检查其中一项 samples,这似乎是推荐的访问方式。

或者,正如@eryksub 提到的,可以使用 LoadLibraryExwin32api 可用于获取句柄并将其传递给 WinDLL,如下所示:

import ctypes
import win32api
import win32con

dll_name = r'C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll'
dll_handle = win32api.LoadLibraryEx(dll_name, 0, win32con.LOAD_WITH_ALTERED_SEARCH_PATH)
rsa300 = ctypes.WinDLL(dll_name, handle=dll_handle)

这里是泰克应用工程师。

Martin 是正确的,我们的 dll 确实 在它所在的文件夹中有依赖项。看起来您使用的是我们 API 的旧版本,它在 C:\Tektronix\RSA306 API\lib\x64 文件夹中有一大堆依赖项。 API 的较新版本清除并整合了许多这些依赖项,并重命名了许多功能以提高清晰度和一致性。我们的软件工程师还决定在安装新版本时不会覆盖旧的 API,因此即使您安装了最新的 API.

,您的旧脚本仍然可以工作

FWIW,我在所有 RSA 控制脚本的开头使用以下代码:

"""
################################################################
C:\Tektronix\RSA306 API\lib\x64 needs to be added to the 
PATH system environment variable
################################################################
"""
os.chdir("C:\Tektronix\RSA_API\lib\x64")
rsa = cdll.LoadLibrary("RSA_API.dll")

这里是 link 下载最新版本的 RSA API(截至 2016 年 11 月 1 日): http://www.tek.com/model/rsa306-software

这里是 link 下载 API 文档(截至 2016 年 11 月 1 日)。本文档附有一个 Excel 电子表格,概述了旧函数和新函数之间的区别: http://www.tek.com/spectrum-analyzer/rsa306-manual-6