我正在使用以下python代碼向RAD Studio C Builder構建的應用程式發送字串:
import win32con
import win32gui
import ctypes
import ctypes.wintypes
FindWindow = win32gui.FindWindow
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure)。
_fields_ = [
('dwData', ctypes.wintypes.LPARAM) 。
('cbData', ctypes.wintypes.DWORD) 。
('lpData', ctypes.c_wchar_p)
]
hwnd = FindWindow(None, "SIGNAL")
cds = COPYDATASTRUCT()
cds.dwData = 0
mystr = "這是一個信號的資訊..."。
cds.cbData = ctypes.sizeof(ctypes.create_unicode_buffer(mystr))
cds.lpData = ctypes.c_wchar_p(mystr)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
它完美地找到了對手的應用程式,并且SendMessage發送了資料。
我的問題:它只發送了字串的第一個字符。因此,而不是。"這是一個信號的資訊...",它只發送"T"。
我肯定我忽略了一些微不足道的東西,但我沒有發現。
uj5u.com熱心網友回復:
聽起來你的C 代碼把cds.lpData解釋為char*而不是wchar_t*,而且很可能也沒有注意到cds.cbData所指示的位元組數。
另外,Python 代碼應該將 cds.lpData 設定為您從 mystr 創建的 Unicode 緩沖區的指標,而不是 mystr 自己的指標。
uj5u.com熱心網友回復:
為了支持所有可能遇到相同的任務/問題,作業的 "接收 "代碼(RAD Studio C builder)是:
void __fastcall Tmain_form::WMCopyData(TMessage& Message) // 接收訊息 from Python script in C Builder
{
int DataSize。
wchar_t* Data。
COPYDATASTRUCT* CopyData = reinterpret_cast <COPYDATASTRUCT*> (Message.LParam)。
DataSize = CopyData->cbData;
if (DataSize > 0)
{
資料=新的wchar_t[DataSize]。
memcpy(Data, CopyData-> lpData, DataSize)。
// 處理你的資料....
洗掉[] Data。
}
}
為了完整起見,這要放到頭檔案中,在'protected'下面:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
END_MESSAGE_MAP(TForm)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320297.html
標籤:
