3

Python のカスタマイズされたディストリビューションと一緒にアプリを出荷しようとしています (モジュールと独自の拡張機能が追加されています)。

シンプルに保ち、潜在的な既存のインストールと競合するリスクを避けるために、.\DLLS*.* および .\Lib*.* ツリーを \Python32\ からサブディレクトリ .\MyApp の下のアプリと共に出荷するのが最善の方法であると考えました。 \パイソン\

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

2つのDLLのpython3.dllとpython32.dllがあります。1つ目は2つ目のサブセットです。python32.dllのコピーは1つだけです。つまり、\ Windows \ SysWOW64 \ディレクトリに隠されていますが、python3.dllはc:\ Python32\DLLsディレクトリにもあります。

python3.dllの代わりにpython32.dllを使用すると、問題が解決しました。

しかし、なぜ部分的な重複があるのか​​は謎のままです...

于 2012-07-24T09:23:18.590 に答える