如何阻止py_initialize使应用程序崩溃?
How do I stop Py_Initialise crashing the application?
从VBA和VB6我调用一个dll创建一个Python解释器。如果我将PATH
环境变量设置为指向"C:python27"
,将PYTHONPATH
设置为指向"c:python27lib"
,则一切正常。
如果我不设置PATH
然后调用Py_Initialise()
崩溃XL或我的VB6应用程序,即使我先用"c:python27python27.exe"
调用Py_SetProgramName
。
我想在VB/VBA中指定安装,而不是在环境中设置,因为我不能在XL中这样做(适用于VB6)。
到目前为止我找到的最好的答案是它是Python中的一个错误- http://bugs.python.org/issue6498。解释器似乎对某些错误调用exit(),而不是将代码返回给调用者。如果你要在应用中嵌入python,这就不太友好了。
在调用dll之前尝试更改工作目录:
在你的VBA代码:
chdir("c:python27") '- change the working-directory for python
=> call dll '- call the dll
chdir(app.Path) '- change back to your folder (maybe you want to save your current folder bevore you change it the first time and change back to this?!)
问候托马斯。
您可以简单地检查是否设置了所需的环境变量:
dim PPath as string
PPath = trim(Environ("PYTHONPATH"))
if (PPath<>"")
<call dll>
else
msgbox ("Error!")
end if
或者你可以在另一个测试过程中运行dll:如果这个调用有效,你知道调用dll是可以的-这取决于你使用的dll调用,所以我不确定:
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As _
Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Const STILL_ACTIVE = &H103
Const PROCESS_ALL_ACCESS = &H1F0FFF
...
dim IsActive as boolean
dim Handle as long
Dim TaskID As Long
TaskID = Shell("rundll32.exe pyton.dll Py_Initialise()", vbNormalNoFocus)
<wait for some time>
'- check if pyton.dll is still running
Handle = OpenProcess(PROCESS_ALL_ACCESS, False, TaskID)
Call GetExitCodeProcess(Handle, ExitCode)
Call CloseHandle(Handle)
IsActive = IIf(ExitCode = STILL_ACTIVE, True, False)
if (not IsActive) then
msgbox ("Error!")
else
<kill process>
<call dll normally>
end if
问候托马斯。
相关文章:
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QCompleter set模型使应用程序崩溃
- Qt 5 应用程序崩溃并出现"qLineEdit::setText"
- 切换NvAPI_Stereo_Deactivate/NvAPI_Stereo_activate会使unity应用程序崩溃
- eglSwapBuffers上的应用程序崩溃
- VLD 使应用程序崩溃
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 执行递归函数时 C++ 应用程序崩溃
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- LOCAL_SHARED_LIBRARIES使我的应用程序崩溃
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- React 本机 0.59 应用程序崩溃并出现 libc 错误
- 当使用“制造”编译的程序中使用库时,应用程序崩溃
- 如何在导致应用程序崩溃的代码中修复指令
- C++多线程应用程序崩溃
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃