从 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

Python ctypes:带有 LPCSTR [out] 参数的原型

将信息从html传递到python

从 HTML 文本输入到 python 脚本的数据传递