Python C++ DLL 中的对象
Python Objects in C++ DLL
我编写了一个 C++ DLL
用于 MQL4
。我必须使用一些 python
模块。
DLL代码:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
//#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include "Python.h"
#include "numpy/arrayobject.h"
//----
#define MT4_EXPFUNC __declspec(dllexport)
PyObject *Amanda;
PyObject *AmandaZones;
#pragma pack(push,1)
#pragma pack(pop)
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Py_Initialize();
import_array1(-1);
PyObject *pName;
pName = PyString_FromString("Amanda");
Amanda = PyImport_Import(pName);
Py_DECREF(pName);
if (Amanda != NULL){
AmandaZones = PyObject_GetAttrString(Amanda, "CalculateZones");
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
Py_DECREF(Amanda);
Py_DECREF(AmandaZones);
Py_Finalize();
break;
}
//----
return(TRUE);
}
MT4_EXPFUNC int __stdcall CalculateZones(double *data, double quantile,const int arraySize)
{
if (arraySize < 1 || data == NULL) return 2;
if (AmandaZones == NULL) return 0;
return 1;
}
在我将其从 Metatrader
中删除并重新附加之前,它运行良好。它 returns 0 表示 AmandaZones
是 NULL
.
简单地说,如果第二次附加DLL文件,PyObjects
不会被加载并且return NULL指针。代码有什么问题?我认为这是一个内存泄漏问题,因为如果我删除 if (AmandaZones == NULL) return 0;
,它会抛出 Access Violation Read error
.
谢谢
numpy
在 C++ 中使用时不应初始化两次。 Py_finilize()
无法正常工作并且不会删除 numpy
模块对象。我从这里解决https://github.com/numpy/numpy/issues/8097
我编写了一个 C++ DLL
用于 MQL4
。我必须使用一些 python
模块。
DLL代码:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
//#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include "Python.h"
#include "numpy/arrayobject.h"
//----
#define MT4_EXPFUNC __declspec(dllexport)
PyObject *Amanda;
PyObject *AmandaZones;
#pragma pack(push,1)
#pragma pack(pop)
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Py_Initialize();
import_array1(-1);
PyObject *pName;
pName = PyString_FromString("Amanda");
Amanda = PyImport_Import(pName);
Py_DECREF(pName);
if (Amanda != NULL){
AmandaZones = PyObject_GetAttrString(Amanda, "CalculateZones");
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
Py_DECREF(Amanda);
Py_DECREF(AmandaZones);
Py_Finalize();
break;
}
//----
return(TRUE);
}
MT4_EXPFUNC int __stdcall CalculateZones(double *data, double quantile,const int arraySize)
{
if (arraySize < 1 || data == NULL) return 2;
if (AmandaZones == NULL) return 0;
return 1;
}
在我将其从 Metatrader
中删除并重新附加之前,它运行良好。它 returns 0 表示 AmandaZones
是 NULL
.
简单地说,如果第二次附加DLL文件,PyObjects
不会被加载并且return NULL指针。代码有什么问题?我认为这是一个内存泄漏问题,因为如果我删除 if (AmandaZones == NULL) return 0;
,它会抛出 Access Violation Read error
.
谢谢
numpy
在 C++ 中使用时不应初始化两次。 Py_finilize()
无法正常工作并且不会删除 numpy
模块对象。我从这里解决https://github.com/numpy/numpy/issues/8097