3

我正在尝试将应用程序与 Python 的定制发行版一起发布(添加了模块和我自己的扩展)。

为了保持简单并且不会与潜在的现有安装发生冲突,我认为最好的方法是将 .\DLLS*.* 和 .\Lib*.* 树从 \Python32\ 与我的应用程序一起放在子目录 .\MyApp 下\Python\

我只直接调用了 3 个 Py* 函数:(代码是 C++ Builder...)

typedef void (__stdcall *PY_SETPYTHONHOME) (wchar_t *);
PY_SETPYTHONHOME Py_SetPythonHome;

typedef void (__stdcall *PY_INITIALIZE) ();
PY_INITIALIZE Py_Initialize;

typedef int (__stdcall *PYRUN_SIMPLESTRING) (const char *);
PYRUN_SIMPLESTRING PyRun_SimpleString;




HMODULE py_dll_hndle;
py_dll_hndle = ::LoadLibrary((ExtractFilePath(Application->ExeName) + "Python\\DLLS\\python3.dll").c_str());
ShowMessage(py_dll_hndle == NULL ? L"Bah" : L"Yay");     // Result: "Yay"


Py_SetPythonHome = (PY_SETPYTHONHOME) ::GetProcAddress(py_dll_hndle, "Py_SetPythonHome");
ShowMessage(Py_SetPythonHome == NULL ? L"Bah" : L"Yay");     // Result: "Yay"


Py_Initialize = (PY_INITIALIZE) ::GetProcAddress(py_dll_hndle, "Py_Initialize");
ShowMessage(Py_Initialize == NULL ? L"Bah" : L"Yay");     // Result: "Yay"


PyRun_SimpleString = (PYRUN_SIMPLESTRING) ::GetProcAddress(py_dll_hndle, "PyRun_SimpleString");
ShowMessage(GetLastError());     // Result: "127" (ERROR_PROC_NOT_FOUND)
ShowMessage(PyRun_SimpleString == NULL ? L"Bah" : L"Yay");     // Result: "Bah"

PyRun_SimpleString 不存在?我一直在寻找使用http://www.nirsoft.net/ DLL 导出查看器...它不存在。我很困惑......它在哪里?

4

1 回答 1

4

有两个DLL的python3.dll和python32.dll。第一个是第二个的子集。python32.dll 只有一个副本 - 隐藏在我的 \Windows\SysWOW64\ 目录中,而 python3.dll 也在 c:\Python32\DLLs 目录中。

使用 python32.dll 而不是 python3.dll 解决了这个问题。

为什么会有部分重复仍然是一个谜......

于 2012-07-24T09:23:18.590 回答