从 python 文本将完整的 LPCSTR 传递给 c++ dll
Posted
技术标签:
【中文标题】从 python 文本将完整的 LPCSTR 传递给 c++ dll【英文标题】:Passing a complete LPCSTR to a c++ dll from python text 【发布时间】:2017-05-30 04:03:23 【问题描述】:我有一个简单的 c++ dll,它调用 MessageBox 来显示文本
#include <Windows.h>
#define LIBDLL extern "C" __declspec(dllexport)
LIBDLL void Display(LPCTSTR lpInput)
MessageBox(0, lpInput, 0, 0);
bool __stdcall DllMain(void* hModule, unsigned long dwReason, void* lpReserved)
switch (dwReason)
case 1:
break;
case 0:
break;
case 2:
break;
case 3:
break;
return true;
而 Python 代码只在 dll 中向 Display 传递了一个字符串,看起来像这样
import ctypes
sampledll = ctypes.WinDLL('SampleDll.dll')
sampledll.Display('Some Text')
它只显示第一个字母,即使我使用的是 std::cout
如何让它显示我传递给它的所有文本?
【问题讨论】:
请参阅documentation of MessageBox。您会看到所需的参数是LPCTSTR
,而不是LPCSTR
。如果您不知道其中的区别,那么是时候了解一下 ANSI 和宽字符串之间的区别了。因此,您很可能需要传递使用宽字符的字符串。
改了,结果还是一样
确保向MessageBox
函数发送正确的字符串类型。我不知道 Pyhon,我不知道你发送给 DLL 函数的字符串是否是宽字符串。底线——您需要 Python 代码和 DLL 就来回发送的字符串类型达成一致。到目前为止,情况似乎并非如此。此外,std::cout
做同样事情的原因也是出于同样的原因。如果字符串是宽字符串,则如果要查看整个字符串,请使用 std::wcout
。
【参考方案1】:
最后解决这个问题。事实证明,在将文本传递给 dll 之前,我必须对其进行编码。
所以不要这样做
sampledll.Display('Some Text')
应该是这样的
sampledll.Display('Some Text'.encode('utf-8))
【讨论】:
以上是关于从 python 文本将完整的 LPCSTR 传递给 c++ dll的主要内容,如果未能解决你的问题,请参考以下文章
LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误
Python函数:使用批处理文件将参数从.txt文件传递给python函数并执行函数
python 用于从文本文件中提取电子邮件地址的python脚本。您可以将其传递给多个文件。它将电子邮件地址打印到stdout,on