1

以下给出错误

drop function testing();
CREATE FUNCTION testing()
 RETURNS text
AS $$
import ctypes
try:
   ctypes.windll.LoadLibrary("D:\\jcc.dll")
except:
   import traceback
   plpy.error(traceback.format_exc())
return ''
$$ LANGUAGE plpythonu;
select testing();

错误信息:

ERROR:  ('Traceback (most recent call last):\n  File "<string>", line 5, in __plpython_procedure_testing_1517640\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 431, in LoadLibrary\n    return self._dlltype(name)\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 353, in __init__\n    self._handle = _dlopen(self._name, mode)\nWindowsError: [Error 126] The specified module could not be found\n',)

它在 python 解释器中运行良好。

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.windll.LoadLibrary("D:\\jcc.dll")
<WinDLL 'D:\jcc.dll', handle 410000 at 1d9cb10>
>>>
4

1 回答 1

1

“找不到指定的模块”是 Windows 发出的那些有用的错误消息之一,它并不总是意味着你认为它的意思。

如果找不到您尝试加载的 DLL或它所依赖的任何 dll, Windows 将生成该消息。

由于 PostgreSQL 在其自己的用户帐户中运行,因此它与您的解释器在测试时运行的路径不同。如果jcc.dll取决于(比如说)c:\jccsupportfiles\aaa.dll并且c:\jccsupportfiles在您的 PATH 上而不是 Pg 服务器的 PATH 上,那将解释您的问题。

尝试使用Dependency Walker (depends.exe)来确定您的 DLL 需要哪些 DLL 以及它们在哪里。看看是不是PATH问题。

与其弄乱 Pg 服务器的 PATH,不如考虑将 jcc.dll 所需的所有 DLL 放在与 jcc.dll 相同的目录中。当 IIRC Windows 尝试加载它所依赖的模块时,它总是会在与它首先加载的模块相同的目录中查找。

于 2011-11-29T03:14:03.973 回答