2017-05-30 112 views
3

我有一個簡單的C++ DLL調用的MessageBox顯示文本傳遞一個完整的LPCSTR到C++,從蟒蛇文本DLL

#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,它看起來是這樣的

import ctypes 
sampledll = ctypes.WinDLL('SampleDll.dll') 
sampledll.Display('Some Text') 

而且只顯示第一個字母,即使我使用std ::法院

MessageBox output

如何讓它顯示我傳遞給它的所有文本?

+2

來完成請參閱[MessageBox中的文件(https://msdn.microsoft.com/en-us /library/windows/desktop/ms645505%28v=vs.85%29.aspx)。您將看到所需的參數是「LPCTSTR」,而不是「LPCSTR」。如果您不知道其中的差別,那麼大致瞭解ANSI和寬字符字符串之間的區別。所以很可能你需要傳遞使用寬字符的字符串。 – PaulMcKenzie

+0

改變了它,但仍輸出相同的結果 – MonSh1rE

+0

確保你發送正確的字符串類型到'MessageBox'函數。我不知道Pyhon,我不知道你發送給DLL函數的字符串是否是寬字符串。底線 - 你需要你的Python代碼和DLL來同意來回發送的字符串類型。目前看來情況並非如此。而且,std :: cout做同樣的事情的原因也是出於同樣的原因。如果要查看整個字符串(如果字符串是一個寬字符串),請使用'std :: wcout'。 – PaulMcKenzie

回答

0

最後解決這個問題。事實證明,我必須在將文本傳遞給dll之前對文本進行編碼。的

所以不是這樣

sampledll.Display('Some Text') 

應該這樣

sampledll.Display('Some Text'.encode('utf-8))