gpt4 book ai didi

python - 使用 ctypes 从 C++ 函数返回字符串给出大的 int,而不是 char 指针

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:28 24 4
gpt4 key购买 nike

我正在尝试在 python 中使用 ctypes 从 dll 调用 C++ 函数。我当前的问题是该函数似乎返回一个大的 int,无论是正数还是负数,而不是我期望的 char 指针。如果我将该 int 转换为 c_char_p 并对其调用 .value,它每次都会杀死我的内核。我已经查看了整个网站和文档,但无法弄清楚。我在这个网站上看到的很多东西甚至会为我抛出错误,比如将字符串传递给 ctypes 对象和函数,而它们应该是字节对象或类似的东西。下面是我的 c++ 代码,它被转换成一个 dll 和我用来从 dll 调用函数的 python 代码。如果有人可以帮助我,那就太棒了。 SaySomething 是有问题的功能。谢谢。

测试库.h

#pragma once

#ifdef TESTLIBRARY_EXPORTS
#define TESTLIBRARY_API __declspec(dllexport)
#else
#define TESTLIBRARY_API __declspec(dllexport)
#endif

#include <windows.h>
#include <cstring>

#ifdef __cplusplus
extern "C"
{
#endif

TESTLIBRARY_API char* SaySomething(const char* phrase);

#ifdef __cplusplus
};
#endif

测试库.cpp

#include "stdafx.h"
#include "TestLibrary.h"
#include <iostream>

TESTLIBRARY_API char* SaySomething(const char* phrase)
{
char* p = new char [100];
p = "string something";
return p;
}

测试器2.py

import ctypes

dbl = ctypes.c_double
pChar = ctypes.c_char_p
pVoid = ctypes.c_void_p

libName = (r"D:\Documents\Coding Stuff\Visual Studio 2017\Projects\TestLibrary"
r"Solution\x64\Debug\TestLibrary.dll")
x = ctypes.windll.LoadLibrary(libName)

x.SaySomething.argtypes = [pChar]
x.SaySomething.restypes = pChar

phrase = b"Hi"
phrase = pChar(phrase)

res = x.SaySomething(phrase)

最佳答案

虽然您可以制作一个 API 来执行您正在尝试执行的操作,但您目前会遇到内存泄漏。更好的解决方案是让 Python 为结果分配和管理内存。

我还修复了评论中提到的 dllimport,并在 .cpp 文件中定义了 TESTLIBRARY_EXPORTS,以便该函数可以从 DLL 中导出。 restype 也已修复。

TesterLibrary.h

#pragma once

#ifdef TESTLIBRARY_EXPORTS
#define TESTLIBRARY_API __declspec(dllexport)
#else
#define TESTLIBRARY_API __declspec(dllimport)
#endif

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#ifdef __cplusplus
extern "C" {
#endif

TESTLIBRARY_API char* SaySomething(const char* phrase, char* result, size_t resultMaxLength);

#ifdef __cplusplus
}
#endif

TesterLibrary.cpp

#define TESTLIBRARY_EXPORTS
#include "TestLibrary.h"
#include <stdio.h>

TESTLIBRARY_API char* SaySomething(const char* phrase, char* result, size_t resultMaxLength)
{
_snprintf_s(result,resultMaxLength,_TRUNCATE,"Decorated <%s>",phrase);
return result;
}

tester2.py

import ctypes

libName = (r"TestLibrary.dll")
x = ctypes.CDLL(libName)

x.SaySomething.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.c_size_t]
x.SaySomething.restype = ctypes.c_char_p

phrase = b"Hi"
result = ctypes.create_string_buffer(100)
res = x.SaySomething(phrase,result,ctypes.sizeof(result))
print(res)
print(result.value)

输出

b'Decorated <Hi>'
b'Decorated <Hi>'

当不再有对它的引用时,Python 将自动释放 result 缓冲区。

关于python - 使用 ctypes 从 C++ 函数返回字符串给出大的 int,而不是 char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45178140/

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