2014-12-05 71 views
0

对不起,我的英文很糟糕。 所以。 我在Dev C++中编写简单的动态链接库。 它的工作很好。今天我导入这是我的python项目中的库。 动态链接库文件路径:lib/my_dll.dll #Dialog箱 config.pyPython CDLL无法加载库2次

DLL_PATH = "lib/my_dll.dll" 

main.py(config.py)进口

def my_func(): 
    dll = CDLL(DLL_PATH) 
    return dll.func1() 

于是我打开Python解释器和写这篇文章。

from main import * 
a = my_func() #Its work nice so a == "c:\\Windows\\a.txt" 

但我重复使用这个功能蟒蛇产生一个错误

OSErrror:[WinError 126] The specified module could not be found 

感谢您的阅读!

+0

提供DLL的完整路径。而且,返回一个以null结尾的字符串的函数最多也是可疑的。我也看不到如何代码可以返回一个字符串。你没有在任何地方指定restype。您应该只加载一次DLL。为什么你想一遍又一遍地加载它? – 2014-12-05 14:36:33

+0

谢谢你的回答。这是DLL调用Windows Api文件选择对话框。在函数中没有问题。工作很好。我的基本工程目录c:\ Project。 C:\ Project目录有main.py,config.py和lib目录... lib目录有my_dll.dll。所以我调用my_dll.dll它返回我c_char_p(选定的路径)。 a = my_func()返回给我path.But再次调用此函数示例a = my_func()生成错误 – 2014-12-05 14:46:23

+0

您需要设置'dll.func1.restype = c_char_p'。不要尝试将整型结果转换为'c_char_p(result)'。这会截断64位指针。 – eryksun 2014-12-05 20:37:26

回答

1

在注释中,您声明您的DLL函数调用显示文件选择对话框的API函数。文件选择对话框,除非你告诉他们不要,可以改变工作目录。由于未能指定DLL的完整路径,因此每次都会执行DLL搜索。第一次成功是因为你的工作目录恰好是找到DLL所需要的。随后的时间DLL搜索失败,因为您的工作目录已更改。

几点建议:

  1. 加载DLL时,始终使用要么只是一个文件名,或者一个完整的绝对路径。在你的情况下,我怀疑你需要使用后者。
  2. 每次调用函数时都会加载DLL。仅加载一次就足够了。不要一次又一次地加载浪费时间。
  3. 从Python直接显示文件对话框可能更容易,并避免为此目的创建DLL。
  4. 您的ctypes函数导入没有指定restype,所以我不知道如何从该函数获取文本。更重要的是,我没有看到每次调用函数时如何避免内存泄漏。除非文本生活在一个静态数组中。
+0

谢谢Hefferman先生。这个工程!我复制我的dll文件在我的当前目录中有main.py和config.py。并改变CDLL方法cdll.my_dll.my_func它的作品。 – 2014-12-05 14:56:49