Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何阻止Py_初始化程序崩溃?_C++_Python_Excel_Vba_Vb6 - Fatal编程技术网

C++ 如何阻止Py_初始化程序崩溃?

C++ 如何阻止Py_初始化程序崩溃?,c++,python,excel,vba,vb6,C++,Python,Excel,Vba,Vb6,我从VBA和VB6调用一个dll,创建一个Python解释器。如果我将PATH环境变量设置为指向“C:\python27”并将PYTHONPATH设置为“C:\python27\lib”则一切正常 如果我没有设置路径,那么调用Py_Initialise()会使XL或我的VB6应用程序崩溃,即使我先用调用Py_SetProgramName“c:\python27\python27.exe” 我希望在VB/VBA中指定安装,而不是在环境中设置安装,因为在XL中无法这样做(VB6正常工作)。在调用dl

我从VBA和VB6调用一个dll,创建一个Python解释器。如果我将
PATH
环境变量设置为指向
“C:\python27”
并将
PYTHONPATH
设置为
“C:\python27\lib”
则一切正常

如果我没有设置
路径
,那么调用
Py_Initialise()
会使XL或我的VB6应用程序崩溃,即使我先用
调用
Py_SetProgramName
“c:\python27\python27.exe”


我希望在VB/VBA中指定安装,而不是在环境中设置安装,因为在XL中无法这样做(VB6正常工作)。

在调用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?!)

关于Thomas,到目前为止,我找到的最好的答案是它是Python中的一个bug-。intepreter似乎对某些错误调用exit(),而不是将代码传递回调用方。如果在应用程序中嵌入python,则不太友好。但是,您可以这样做。

您只需检查是否设置了所需的环境变量:

dim PPath as string
PPath = trim(Environ("PYTHONPATH"))
if (PPath<>"")
  <call dll>
else
  msgbox ("Error!")
end if
dim PPath作为字符串
PPath=修剪(环境(“PYTHONPATH”))
如果(PPath“”)
其他的
msgbox(“错误!”)
如果结束
或者您可以在另一个测试过程中运行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
Private声明函数CloseHandle Lib“kernel32”(ByVal_
如:①只要
私有声明函数OpenProcess Lib“kernel32”(ByVal_
希望访问的时间尽可能长,希望访问的时间尽可能长_
Long,ByVal dwProcessId As Long)As Long
私有声明函数GetExitCodeProcess Lib“kernel32”_
(ByVal HPPROCESS尽可能长,lpExitCode尽可能长)尽可能长
常量仍然处于活动状态=&H103
常量进程\u所有\u访问=&H1F0FFF
...
dim IsActive为布尔型
暗柄一样长
暗淡的TaskID一样长
TaskID=Shell(“rundll32.exe pyton.dll Py_Initialise()”,vbNormalNoFocus)
“-检查pyton.dll是否仍在运行
Handle=OpenProcess(PROCESS\u ALL\u ACCESS,False,TaskID)
调用GetExitCodeProcess(句柄,ExitCode)
调用CloseHandle(句柄)
IsActive=IIf(ExitCode=STILL_ACTIVE,True,False)
如果(不是主动的)那么
msgbox(“错误!”)
其他的
如果结束

考虑到Thomas

甚至可以通过某种方式检查配置是否工作良好。最糟糕的情况是,我可以使用getenv或GetEvvironmentVariable设置env变量(我在windows上)。我想链接到python的安装副本,而不是破坏excel或任何其他python嵌入程序。这并不能真正解决Py_Initialise使应用程序崩溃的问题。更糟糕的是,将程序绑定到Windows计算机上,在硬盘C的标准位置安装了python 2.7。应用程序崩溃是因为[Py_Initialise]没有找到某个文件夹或文件?!因此,如果您切换到[Py_Initialise]搜索文件/文件夹的文件夹,它将不会崩溃-希望如此。[larsmans]我使用这条路径是因为问题中提到了它。。。?!这个答案只给出了你必须做什么的粗略想法。@Thomas,虽然这可能是个好建议,但它并没有回答这个问题。如我的问题所示,我可以正确设置。我正在试图找出如果设置不正确,如何阻止Py_Initialize终止主机进程-我希望有一个漂亮的对话框告诉用户问题。是的。我正在考虑运行一个测试过程,看看设置是否正常。不是很喜欢它,但如果没有其他方法来防止Py_初始化崩溃它的主机,那么这可能就是答案。谢谢。