2011-10-09 53 views
4

我在C++ borland中創建了一個VCL應用程序。在我的項目中有一個文件,我在其中定義的方法中實現了嵌入式python(我的應用程序包含一個調用實現嵌入式python的方法的按鈕)。當我編譯時,我的構建是成功的。但是當我運行我的應用程序,然後單擊該按鈕時,它顯示運行時錯誤:「模塊'PYTHON25.DLL'中地址1E091375處的訪問衝突。讀取地址00000004」。請幫忙。 我從來沒有用過Python。 我的程序:在C++中嵌入python

#pragma hdrstop 

#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 


#include "Python.h" 

#include "Unit1.h" 
#include "Unit2.h" 
#pragma link "python25_bcpp.lib" 

//--------------------------------------------------------------------------- 

#pragma package(smart_init) 

bool callHelloWorld(int intVal) 
{ 
    char fName[] = "Hello"; //file name 
    char cFunc[] = "hello"; //method name 

    char *pfName, *pcFunc; 

    PyObject *pName, *pModule, *pDict, *pFunc ; 

    pfName = fName; 
    pcFunc = cFunc; 

    Py_Initialize(); 

    pName = PyString_FromString(pfName); 

    pModule = PyImport_Import(pName); 

    pDict = PyModule_GetDict(pModule); 

    pFunc = PyDict_GetItemString(pDict, pcFunc); 

    if (PyCallable_Check(pFunc)) 
    { 
     PyObject_CallObject(pFunc, NULL); 
    } else 
    { 
     PyErr_Print(); 
    } 


    // Py_DECREF(pModule); 
    // Py_DECREF(pName); 

    Py_Finalize(); 

    return 0; 
} 
+3

我似乎記得Borland C++使用不同的調用約定(fastcall?)。你的python.dll是使用相同的編譯器編譯的嗎? – cdarke

+0

python25.dll在C:\ Windows \ SysWOW64中。我沒有編譯它。 –

+0

我不知道這是否會有所幫助,但我認爲你錯過了一些python文件。我記得在嘗試在另一臺機器上編譯我的程序時遇到同樣的錯誤。但在我的情況下,我正在使用一個MFC程序,並且正在使用python腳本訪問我的MFC DLL。可能嘗試重新安裝python。 – Neophile

回答

1

檢查的PyImport_Import的返回值(在搜索路徑的模塊?)和PyDict_GetItemString

如果這無助於在您的應用中放置一些跟蹤消息以查看它崩潰的位置。

0

這個工作對我來說:

只要刪除Py_Finalize()

我在其他網站Py_Finalize在特定情況下,如線程的一些問題閱讀。

+0

請提供資料來源? – quantum