2011-10-09 7 views
4

나는 borland에있는 VCL 응용 프로그램을 만들었습니다. 내 프로젝트에는 이미 정의 된 메소드 (내장 된 파이썬이 구현 된 메소드를 호출하는 버튼이 내 애플리케이션에 포함되어 있음)에 임베디드 Python을 구현 한 파일이 있습니다. 컴파일하면 빌드가 성공적입니다. 하지만 내 응용 프로그램을 실행하고 버튼을 클릭하면 런타임 오류가 표시됩니다 : " 'PYTHON25.DLL'모듈의 주소 1E091375에서 액세스 위반."00000004 주소 읽기 ". 도와주세요. 전에 파이썬을 사용한 적이 없습니다. 내 프로그램 :파이썬을 C++에 임베드

#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

이것이 도움이 될지 모르겠지만, 파이썬 파일 중 일부가 누락되었다고 생각합니다. 다른 컴퓨터에서 내 프로그램을 컴파일 할 때 동일한 오류가 발생하는 것을 기억합니다. 하지만 제 경우에는 MFC 프로그램을 사용하고 파이썬 스크립트를 사용하여 MFC DLL에 액세스하고있었습니다. 파이썬을 다시 설치해보십시오. – Neophile

답변

1

확인 반환 PyImport_Import의 값 (검색 경로에서 모듈?)와 PyDict_GetItemString.

그렇다면 일부 추적 메시지를 앱에 넣으면 충돌이 발생하는 곳을 볼 수 없습니다.

0

이 나를 위해 작동합니다

그냥 Py_Finalize 삭제()

나는 Py_Finalize는 스레딩과 같은 특정 경우에 몇 가지 문제를 가지고 다른 사이트에서 참조하십시오.

+0

정보 출처를 알려주세요. – quantum