powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выделение области памяти
12 сообщений из 12, страница 1 из 1
Выделение области памяти
    #39666435
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Есть у меня маленькая прога по передаче символьного сообщения другому приложению

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
 CDS: TCopyDataStruct;
 ss, s, Buffer : ansistring;
 pBuffer : ^String;
 begin
  Buffer := UTF8Encode('123'); 

  pBuffer := HeapAlloc(GetProcessHeap(),0, Sizeof(Buffer));
  pBuffer := Pointer(Buffer);

  CDS.dwData := 110;
  CDS.cbData := StrLen(PChar(Buffer)) + 1;
  CDS.lpData := pBuffer;

  GetWindowText(wd, buf, sizeof(buf));
  s := StrPas(buf);
  if (GetWindowLong(Wd, GWL_USERDATA) = 305419896)
    then Windows.SendMessage(wd, WM_COPYDATA, 0, LParam(@CDS));
  EnumProc := true;
  HeapFree(GetProcessHeap(), 0, pBuffer);



Скорее всего я накосячил с выделением памяти. Укажите на ошибку, пожалуйста, сообщение приходит, но совсем не '123', либо процедура-приемник сообщений в другом приложении это сообщение не понимает

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666441
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Sizeof(Buffer)

Посмотри на результат этого выражения. И больше никогда так не делай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666455
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
patrick1968, если выкинуть ненужное, остаётся:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
CDS: TCopyDataStruct;
Buffer : ansistring;
 begin
   Buffer := UTF8Encode('123'); 
   CDS.dwData := 110;
   CDS.cbData := Length(Buffer) + 1;
   CDS.lpData := @(Buffer[1]);

   if (GetWindowLong(Wd, GWL_USERDATA) = 305419896)
      then Windows.SendMessage(wd, WM_COPYDATA, 0, LParam(@CDS));
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666458
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.06.2018 12:29, MBo пишет:
> Buffer := UTF8Encode('123');

кисо, скажите мне как художник художнику - НАХРЕНА?!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666460
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Равен 4, это ведь 4 байта
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666472
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МВо, попробовал ваш вариант, к сожалению не работает

есть у меня работающий пример на VFP

lcStringToSend=Strconv(lcstr + Chr(0), 5)
lnPtrStringToSend = WinAPI_HeapAlloc(WinAPI_GetProcessHeap(), 0, Lenc(lcStringToSend))
Sys(2600, lnPtrStringToSend,Lenc(lcStringToSend), lcStringToSend) && Copy value to memory
Local lcCOPYDATASTRUCT As String
lcCOPYDATASTRUCT = ;
BINTOC(ID_DATA, "4RS") ; && ULONG_PTR dwData
+ BinToC(Lenc(lcStringToSend), "4RS") ; && DWORD cbData
+ BinToC(lnPtrStringToSend, "4RS")

у меня подозрение, что в структуре оплошность
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666473
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Lenc(lcStringToSend)
Размер строки и размер указателя на неё это не одно и то же.
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666478
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CDS.cbData := Length(Buffer) + 1; так это же размер строки
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666488
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968так это же размер строки

Всё правильно, он и должен передаваться. Ты что, документацию на WM_COPTDATA совсем не
читал?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666494
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
CDS: TCopyDataStruct;
Buffer : ansistring;
 begin
   Buffer := UTF8Encode('123'); 
   CDS.dwData := 110;
   CDS.cbData := Length(Buffer) + 1;
   CDS.lpData := @(Buffer[1]);

   if (GetWindowLong(Wd, GWL_USERDATA) = 305419896)
      then Windows.SendMessage(wd, WM_COPYDATA, 0, LParam(@CDS));



так я вот так сейчас сделал
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666502
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
patrick1968,
Что значит - "к сожалению не работает" ?
Код рабочий. Может быть, кто-то его неправильно применяет, например, посылает сообщение фиг знает кому. Вот полный тест:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure CopyData(var M :TMessage); message WM_COPYDATA;

procedure TForm1.CopyData(var M: TMessage);
var
  sa: AnsiString;
begin
  SetString(sa, PAnsiChar(PCopyDataStruct(M.LParam).lpData), PCopyDataStruct(M.LParam).cbData - 1);
  Caption := sa;
end;


procedure TForm1.Button11Click(Sender: TObject);
var
CDS: TCopyDataStruct;
Buffer : ansistring;
 begin
   Buffer := UTF8Encode('123');
   CDS.dwData := 110;
   CDS.cbData := Length(Buffer) + 1;
   CDS.lpData := @(Buffer[1]);
  SendMessage(Handle, WM_COPYDATA, 0, LParam(@CDS));
end;
...
Рейтинг: 0 / 0
Выделение области памяти
    #39666517
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, действительно не так приемник работает
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выделение области памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]