I am using the following python code to send String to a RAD Studio C Builder built application:
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 = "This is a message to signal..."
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))
It is perfectly find the opponent application and SendMessage sends data.
My problem: It only sends the 1st character of the string. So instead of: "This is a message to signal..."
, it only sends "T"
.
I am sure that I am overlooking something trivial, but I could not found it.
CodePudding user response:
Sounds like your C code is interpreting the cds.lpData
as a char*
instead of as a wchar_t*
, and likely is not paying attention to the byte count indicated by cds.cbData
, either.
Also, the Python code should be setting cds.lpData
to (a pointer to) the Unicode buffer you created from mystr
, not (a pointer to) mystr
itself.
CodePudding user response:
To support all may run into the same task/issue, the working "receive" code (RAD Studio C builder) is:
void __fastcall Tmain_form::WMCopyData(TMessage& Message) // Receiving messages from Python script in C Builder
{
int DataSize;
wchar_t* Data;
COPYDATASTRUCT* CopyData = reinterpret_cast <COPYDATASTRUCT*> (Message.LParam);
DataSize = CopyData->cbData;
if (DataSize > 0)
{
Data = new wchar_t[DataSize];
memcpy(Data, CopyData->lpData, DataSize);
// Process your data....
delete [] Data;
}
}
Just to be complete, this goes to the header file, below 'protected':
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
END_MESSAGE_MAP(TForm)