将指针从Python传输到dll,并获取修改后的值

时间:2018-06-21 08:14:49

标签: python c++ pointers dll ctypes

我正在为以下问题而苦苦挣扎,我想这对具有更高C语言技能的人来说并没有那么复杂。

我的意图是从Python访问存储在DLL中的C ++函数。 我设法使它运行以实现简单的功能,例如ADD和MULT。

由于我想访问的功能(稍后)将返回多个浮点值,因此需要使用指针。

我想执行以下基本步骤:

-在python中创建变量,

-将指针转移到dll(ctypes-> c_pointer(...)),

-更新指针所指向的值;

-返回python并使用修改后的值。

我用于dll创建的C ++函数是:

#include <stdio.h>
#include <wchar.h>
#include <iostream>
#include <vector>
#include <math.h>  
#include <fstream>
using namespace::std;

extern "C" {

__declspec(dllexport)
int Kappel(double a, double *f){
    *f = 25.5;

return 0;
}
} // extern "C"

我在dll中调用该函数的python代码如下:

import os  
import os.path
import ctypes
from ctypes import pointer,c_long,c_int,c_double
lib_path=os.path.dirname(os.path.abspath(__file__))+os.path.sep+'test.dll'
lib = ctypes.CDLL(lib_path)

lib.Kappel.resttype = pointer(c_double())

p = 1.5 
Cp = c_double(1.5)
Cp_ = pointer(c_double(p))

def test3(wert, zeiger):
   func = lib.Kappel   
   Res = func(wert, zeiger)
   return Res

#Output after modification
print('Returnvalue: ', test3(Cp,Cp_))
print(p)
print(Cp)
print(Cp_)

感谢您的帮助 埃里克

2 个答案:

答案 0 :(得分:1)

几分钟前解决了该问题。 就像想象中一样简单...

不起作用:

p = 1.5
Cp = c_double(p)
Cp_ = pointer(c_double(p))

作品:

p = 1.5
Cp = c_double(p)
Cp_ = pointer(Cp)

答案 1 :(得分:0)

ctypes具有byref,这是您想要执行的操作的首选方式:

# Given: int Kappel(double a, double *f)
lib.Kappel.argtypes = c_double,POINTER(c_double)
lib.Kappel.restype = c_int

out = c_double() # Create instance of a C type to pass by reference.
lib.Kappel(1.5,byref(out))
print(out.value) # Retrieve the value.