Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2015, 02:10   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию WM_COPYDATA Передать Собственную структуру

Собственно сабж, не могу понять как передать структуру...
Связываю недо программу чужую поддерживающую скрипты на делфи, ну уж оооочень ограниченно, но она поддерживает dll и winapi.
Вот код в ней:
Код:
type
  TCopyDataStruct = record
    dwData: Cardinal; 
    cbData: DWORD; 
    lpData: Pointer; 
  end;

  PCopyDataStruct = ^TCopyDataStruct;
  
  TDWordFiller = record
  {$IFDEF CPUX64}
    Filler: array[1..4] of Byte; // Pad DWORD to make it 8 bytes (4+4) [x64 only]
  {$ENDIF}
  end;
  
  TWMCopyData = record
    Msg: Cardinal;
    MsgFiller: TDWordFiller;
    From: THandle;
    CopyDataStruct: PCopyDataStruct;
    Result: Integer;
  end;

function GetAsyncKeyState(vKey: integer): integer; stdcall; external 'user32.dll';
function SetParent(WndChild, WndNewParent: THandle): THandle;stdcall; external 'user32.dll';
function SendMessageW(hWnd: integer; Msg: LongWord; wParam: Cardinal; lParam: integer): integer; stdcall; external 'user32.dll';
function FindWindowW(lpClassName, lpWindowName: PWideChar): Cardinal; stdcall; external 'user32.dll';
function SetForegroundWindow(hwnd: integer) : Boolean; stdcall; external 'user32.dll';

procedure SetThemeAppProperties(int:Integer);stdcall; external 'uxtheme.dll';
function GetThemeAppProperties:Integer;stdcall; external 'uxtheme.dll';

Function SendString(stringToSend : string):Integer;
var
   copyDataStruct : TCopyDataStruct;
begin
   copyDataStruct.dwData := 0; 
   copyDataStruct.cbData := 1 + Length(stringToSend)*2 ;
   copyDataStruct.lpData := PChar(stringToSend);
   REsult:=SendData(copyDataStruct) ;
   if REsult<=0 then
   begin
    if REsult<0 then engine.msg(inttostr(REsult),stringToSend, 222);
    if assigned(Socket) then
    begin
      Socket.SendString(stringToSend);
      if Socket.LastError <> 0 then engine.msg(inttostr(Socket.LastError),stringToSend, 222);
    end;
   end;
end;

Function SendData(const copyDataStruct: TCopyDataStruct):Integer;
 var
    res : integer;
    szRetText: PChar;
begin
  //print(receiverHandle); 
  if receiverHandle = 0 then
  begin
    receiverHandle :=FindWindowW('Tfmain',''); //FindWindowEx(0,0,PChar('TReceiverMainForm'),PChar('ReceiverMainForm'));
    if receiverHandle = 0 then
    begin
      print('Can`t find Window '+string(copyDataStruct.lpData));
      Exit;
    end;
  end;                           
  REsult:=(SendMessageW(receiverHandle, WM_COPYDATA, Integer(receiverHandle), Integer(@copyDataStruct)));
end;
Сейчас формирую StringList и отправляю SendString(StringList.Text);
Код подстроил из примеров, которые нашел собственно на нашем форуме.
Структура (TCharArray) выглядит так:
Код:
TsCharItem = packed record
    Name: string;
    ClassName: string;
    ClassID : Byte;
    Clan: string;
    ClanID : Cardinal;
    level : Byte;
    Rating: Cardinal;
    TargetName: string;
    Dead: boolean;
    MyTarget: boolean;
    TargetMe: boolean;
    Dist: integer;
    Position:TPoint;
    PvP: boolean;
    PK: boolean;
  end;
TCharArray :array of TsCharItem;

Последний раз редактировалось IvaniuS; 18.08.2015 в 12:35.
IvaniuS вне форума Ответить с цитированием
Старый 18.08.2015, 07:42   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,357
По умолчанию

И в чем вопрос?
waleri вне форума Ответить с цитированием
Старый 18.08.2015, 12:32   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

WM_COPYDATA Передать Собственную структуру, собственно как?)
Со строкой все понятно откуда размеры брать и не только, а вот как правильно посчитать и передать структуру - не понятно, видел пример там где в TMemoryStream записывали, но я если честно слабо представляю как это сделать со структурой.

Последний раз редактировалось IvaniuS; 18.08.2015 в 12:35.
IvaniuS вне форума Ответить с цитированием
Старый 18.08.2015, 12:46   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну если в структуре есть тип string, то будет сложно. Придется сериализировать (Как раз через TMemoryStream к примеру). Если ты заменишь string на array[1..100500] of char то вычислить длину всей записи не будет составлять труда.
А вообще я бы не делал так, хотя я и не в курсе как твоя программа, та что получает, работает предварительно я бы точно не делал через копипаст.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2015, 13:43   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну если в структуре есть тип string, то будет сложно. Придется сериализировать (Как раз через TMemoryStream к примеру). Если ты заменишь string на array[1..100500] of char то вычислить длину всей записи не будет составлять труда.
А вообще я бы не делал так, хотя я и не в курсе как твоя программа, та что получает, работает предварительно я бы точно не делал через копипаст.
На самом деле там все стринги не могут быть длинее 128 символов, а большинство и то короче - 16-24, т.е. по сути все они могут быть описаны как вы и сказали.
IvaniuS вне форума Ответить с цитированием
Старый 18.08.2015, 13:46   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда рекомендую так и описать. Тогда в структуре не будет никаких указателей, и ее можно преспокойненько разместить в куче, и передать адрес.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2015, 14:50   #7
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Подскажите тогда пожалуйста решение, если структура будет описана как:
Код:
TsCharItem = packed record
    Name: string[24];
    ClassName: string[24];
    ClassID : Byte;
    Clan: string[24];
    ClanID : Cardinal;
    level : Byte;
    Rating: Cardinal;
    TargetName: string[24];
    Dead: boolean;
    MyTarget: boolean;
    TargetMe: boolean;
    Dist: integer;
    Position:TPoint;
    PvP: boolean;
    PK: boolean;
  end;
TCharArray :array of TsCharItem;
IvaniuS вне форума Ответить с цитированием
Старый 18.08.2015, 15:04   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну так по идее подойдет и твое решение. Должно подойти.
Учитывая что
Код:
with copyDataStruct do begin
 cbData:=Length(CharArray)*sizeof(TsCharItem)
 lpData:=@CharArray[0];
end;
Но это с потолка. Я таким методом передачи не пользовался оч. давно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2015, 02:48   #9
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Благодарю, тема закрыта, все достаточно просто оказалось как вы и написали.
IvaniuS вне форума Ответить с цитированием
Старый 19.08.2015, 08:21   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну да. Это называется финализацией структуры. Ну или образмериванием, когда структура не содержит ни одного указателя, тогда это получается голые данные, размеченные полями, и их можно передавать потоком байт.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается передать структуру в функцию по ссылке. Pug_from_Mordor Помощь студентам 2 27.04.2015 18:43
ООП в C++Builder: помогите передать в функцию указатель на структуру =A_Z_A= Помощь студентам 2 13.03.2014 12:05
Как передать структуру в поток при _beginthread Ksardas13 Общие вопросы C/C++ 2 10.03.2012 05:00
Как передать структуру в другой класс? Phallic Общие вопросы C/C++ 10 11.12.2011 13:20
Как передать структуру через socket moiav Общие вопросы C/C++ 6 18.05.2011 16:27