Home > Software engineering >  SendMessage only send the *first* character of the string
SendMessage only send the *first* character of the string

Time:09-18

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)
  • Related