gpt4 book ai didi

python - 使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?

转载 作者:行者123 更新时间:2023-11-30 03:23:24 26 4
gpt4 key购买 nike

我可以:

  1. 从 C++ 中获取一个整数并在 python 中使用它
  2. 发送一个 python 字符串(作为 wchar_t)到 C++ 并用它做一些逻辑

我不能相反方向的第 2 步。

这是我的 C++ 代码(使用 clion 和 cygwin 作为共享库使用 C++14 编译)。

#include <iostream>

wchar_t aa[2];
extern "C" {
int DoA()
{
return 10;
}
int DoB(wchar_t * in)
{
if (in[1] == 'a')
{
return 25;
}
return 30;
}

wchar_t * DoC()
{
aa[0] = 'a';
aa[1] = 'b';
return aa;
}
}

这是我的 python 3.6.1 代码,显示了我能做什么和不能做什么。那么我应该如何获取我的字符串并在 python 中使用它呢?我希望使用带有 wstring_at 的地址来获取值,但它不起作用。

from ctypes import *
import os.path
print('Hello')

itExist = os.path.exists('C:/Users/Daan/CLionProjects/stringproblem/cmake-build-release/cygstringproblem.dll')
print(itExist)
lib = cdll.LoadLibrary('C:/Users/Daan/CLionProjects/stringproblem/cmake-build-release/cygstringproblem.dll')
print('dll loaded')

A = lib.DoA()
print(A)
Bx = lib.DoB(c_wchar_p('aaa'))
print(Bx)
By = lib.DoB(c_wchar_p('bbb'))
print(By)
Ca = lib.DoC()
print(Ca)
print('Issue is coming')
Cb = wstring_at(Ca,2)
print(Cb)

这是错误的输出。

Hello

True

dll loaded

10

25

30

-1659080704

Issue is coming
Traceback (most recent call last):
File "ShowProblem.py", line 19, in <module>
Cb = wstring_at(Ca,2)
File "C:\Users\Daan\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 504, in wstring_at
return _wstring_at(ptr, size)
OSError: exception: access violation reading 0xFFFFFFFF9D1C7000

最佳答案

我在 Linux 上重现了您的问题,并通过定义 DoC 函数的返回类型来更正它:

from ctypes import *
print('Hello')

lib = cdll.LoadLibrary(PATH_TO_TOUR_LIB)
print('dll loaded')
# this line solved the issue for me
lib.DoC.restype = c_wchar_p

A = lib.DoA()
print(A)
Bx = lib.DoB(c_wchar_p('aaa'))
print(Bx)
By = lib.DoB(c_wchar_p('bbb'))
print(By)
Ca = lib.DoC()
print(Ca)
print('Issue is coming')
Cb = wstring_at(Ca,2)
print(Cb)

我还动态分配了内存(一些Python专家可能会对此发表评论,我猜这会导致内存泄漏):

extern "C" {
int DoA()
{
return 10;
}
int DoB(wchar_t * in)
{
if (in[1] == 'a')
{
return 25;
}
return 30;
}

wchar_t * DoC()
{
wchar_t* aa = new wchar_t[2];
aa[0] = 'a';
aa[1] = 'b';
return aa;
}
}

让我知道它是否适用于 Windows。

关于python - 使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com