Я считаю, что @TOndrej определил главную причину проблемы.Тем не менее, я думаю, что у вас есть вторая более тонкая ошибка.
Ваше приложение, которое получает сообщение WM_COPYDATA
, я думаю, обрабатывает lpData
как строку с нулевым символом в конце.Если данные искажены, у вас будет переполнение буфера.Я верю, что это именно то, что происходит в ваших примерах, но это просто оказывается добрым.Маршаллинг WM_COPYDATA
копирует только размер буфера, указанный в cbData
.Вы должны убедиться, что вы не читаете дальше.Вредоносное приложение может отправить вам сообщение WM_COPYDATA
с данными, чтобы заставить вас сделать это.Вместо этого я рекомендую использовать cbData
при чтении.
Итак, чтобы отправить строку, которую вы пишете:
copyData.lpData := PChar(cmdParams);
copyData.cbData := ByteLength(cmdParams))
copyData.dwData := WaterMark;
А затем, когда вы ее получите, вы выделяете буфер и копируете в этот буфер на основена значение cbData
.
SetString(cmdParams, PChar(copyData.lpData), copyData.cbData div SizeOf(Char));