Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с WM_COPYDATA без VCL 
V
    Опции темы
KlenV
Дата 29.12.2011, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Здравствуйте уважаемые граждане программисты.

Пишу  приложение без VCL возникла необходимость посылки сообщений между приложениями при помощи WM_COPYDATA. В проесте с VCL всё работает замечательно а без VCL фигня какае-то. Причем в обработчике сообщений клиента сообщение  WM_COPYDATA: принимается нормально а структура   MsgV: TWMCopyData; остаётся пустой. Уже всю голову сломал.


Сервер , отсылаю так. 


Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var
   aCopyData: TCopyDataStruct;
   hTargetWnd: HWND;
begin



 //begin
   with aCopyData do
   begin
     dwData := 0;
     cbData := StrLen(PChar(Edit1.Text)) + 1;
     lpData := PChar(Edit1.Text)
   end;
   // Search window by the window title 
  // Fenster anhand des Titelzeilentext suchen
  hTargetWnd := FindWindowEx(0, 0, nil, PChar({'WM_COPYDATA-Receiver'}'Клиент'));
   if hTargetWnd <> 0 then
     SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
   else
     ShowMessage('No Recipient found!');


end;

end.






Принимаю так :


Код

program Client;

uses
SysUtils,
 windows,
 messages;



  function WndProc2(hClientWnd: THandle; Msg: integer;
               wParam: longint; lParam: longint; var  MsgV1:TWMCopyData{MsgV1:Pointer}): longint;
                 stdcall; forward;




   //procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;

{èíòåðôåéñû ê ñèñòåìíûì DLL}


var
 CreationCounter:integer=0; // Ñ÷åò÷èê ñîçäàííûõ ãëàâíûõ îêîí
 hClientWnd, hOtherWnd:THandle;
 msg1,msg2,msg3,msg4: integer;

     MsgV: TWMCopyData;
      //Source :string;
     // sText: array[0..99] of Char;







   procedure WMCopyData(var Msg: TWMCopyData);
 var
   sText: array[0..99] of Char;
 begin

   Beep(1500,1500);
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);

   MessageBox(hClientWnd,sText,'Result',MB_OK or MB_ICONINFORMATION);
 end;



function WndProc2(hClientWnd: THandle; Msg: integer; wParam: longint; lParam: longint; var MsgV1:TWMCopyData): longint; stdcall;
  const
      IDedit=1;
      IDLabel=2;

  var i,j:integer;
      rect:TRect;
      s:ShortString;
      CliCount:integer;


begin
  result:=0;

  case Msg of
    WM_COPYDATA:
     begin
         Beep(1500,1500);


          WMCopyData(MsgV);

     end;

    wm_create: {Îðãàíû óïðàâëåíèÿ ñîçäàþòñÿ ïðè ñîçäàíèè ãëàâíîãî îêíà}
      begin
        inc(CreationCounter);
        GetClientRect(hClientWnd,rect); //ðàçìåðû êëèåíòñêîé îáëàñòè

        CreateWindowEx(WS_EX_CLIENTEDGE, // Óòîïëåííàÿ ðàìêà
                   'edit',
                   '',// ïóñòîé òåêñò â ïîëå ââîäà
                   ws_visible or ws_child or ws_tabstop or
                   WS_GROUP or es_autohscroll, //Ãðóïïà çàêîí÷åíà, îòñþäà íà÷èíàåòñÿ ñëåäóþùàÿ
                   5,30,
                   50,25,
                   //rect.right-10,25,
                   hClientWnd,
                   1, //IDedit
                   hInstance,
                   nil);

        CreateWindowEx(0, 'Static',
                    'Íîìåð, ïîëó÷åííûé îò ñåðâåðà',
                    WS_CHILD or SS_LEFT or WS_VISIBLE,
                    8, 8,
                    250, 15,
                    hClientWnd,
                    2, //IDLabel
                    HInstance,
                    nil);

      end;

    wm_close:
      begin
      PostMessage(hOtherWnd,msg4, 0, 0);
      postquitmessage(0);
      end;

    wm_destroy:
      begin //Îðãàíû óïðàâëåíèÿ óíè÷òîæàþòñÿ àâòîìàòè÷åñêè
        dec(CreationCounter);
        if CreationCounter=0 then PostQuitMessage(0);
      end;

    else begin
      if msg = msg2 then hOtherWnd := lparam;  // çàïîìèíàåì õýíäë ñåðâåðà, êîòîðûé ïðèøåë â "Îòâåò"
      if msg = msg1 then result:=0;            // ïðè ïîëó÷åíèè áðîäêàñò îò ñàìîãî ñåáÿ (è îò äðóãèõ êëèåíòîâ) íå îáðàáàòûâàòü
      if msg = msg3 then begin                 // ïðè ïîëó÷åíèè îò ñåðâåðà ID äëÿ ýòîãî êëèåíòà
        CliCount := wparam;                    // çàïîìèíàåì ïðèñëàííûé ID
        s := IntToStr(CliCount)+'            ';
        SendDlgItemMessage(hClientWnd,IDedit,wm_settext,sizeof(s),integer(@s)+1);
      end;
    end;
      if msg = msg4 then postquitmessage(0);   // ïðè ïîëó÷åíèè îò ñåðâåðà êîìàíäû  íà çàêðûòèå

      result:=DefDlgProc(hClientWnd,msg,wparam,lparam);
    end;
  end;


 procedure WinMain; {Îñíîâíîé öèêë îáðàáîòêè ñîîáùåíèé}
  const szClassName2='Controls2';
  var   wndClass2:TWndClassEx;
        msg:TMsg;

begin
  wndClass2.cbSize:=sizeof(wndClass2);
  wndClass2.style:=0;
  wndClass2.lpfnWndProc:=@WndProc2;
  wndClass2.cbClsExtra:=0;
  wndClass2.cbWndExtra:=dlgwindowextra;
  wndClass2.hInstance:=hInstance;
  wndClass2.hIcon:=loadIcon(0, idi_Application);
  wndClass2.hCursor:=loadCursor(0, idc_Arrow);
  wndClass2.hbrBackground:=0;//GetStockObject(ltgray_Brush);
  wndClass2.lpszMenuName:=nil;
  wndClass2.lpszClassName:=szClassName2;
  wndClass2.hIconSm:=loadIcon(0, idi_Application);


  RegisterClassEx(wndClass2);

  hClientWnd:=CreateWindowEx(0,
         szClassName2, {èìÿ êëàññà îêíà}
         'Êëèåíò',    {çàãîëîâîê îêíà}
         ws_popupwindow or ws_sysmenu or ws_caption or ws_border or ws_visible,       {ñòèëü îêíà}
         650,           {Left}
         250,           {Top}
         300,                     {Width}
         100,                     {Height}
         0,                       {õýíäë ðîäèòåëüñêîãî îêíà}
         0,                       {õýíäë îêîííîãî ìåíþ}
         hInstance,               {õýíäë ýêçåìïëÿðà ïðèëîæåíèÿ}
         nil);                    {ïàðàìåòðû ñîçäàíèÿ îêíà}

  msg1:=RegisterWindowMessage('Çàïðîñ');
  msg2:=RegisterWindowMessage('Îòâåò');
  msg3:=RegisterWindowMessage('Äàííûå');
  msg4:=RegisterWindowMessage('Çàâåðøåíèå');

  SendMessage(HWND_BROADCAST, msg1, 0, hClientWnd);
  if hOtherWnd = 0 then MessageBox(hClientWnd,'Íåò ïîäêëþ÷åíèÿ','Result',MB_OK or MB_ICONINFORMATION);

  while GetMessage(msg,0,0,0) do begin {ïîëó÷èòü î÷åðåäíîå ñîîáùåíèå}
    if not IsDialogMessage(hClientWnd,msg)
           {Åñëè Windows íå ðàñïîçíàåò è íå îáðàáàòûâàåò êëàâèàòóðíûå ñîîáùåíèÿ
            êàê êîìàíäû ïåðåêëþ÷åíèÿ ìåæäó îêîííûìè îðãàíàìè óïðàâëåíèÿ,
            òîãäà ÷îîáùåíèå èäåò íà ñòàíäàðòíóþ îáðàáîòêó}
    then begin
      TranslateMessage(msg);   {Windows òðàíñëèðóåò ñîîáùåíèÿ îò êëàâèàòóðû}
      DispatchMessage(msg);    {Windows âûçîâåò îêîííóþ ïðîöåäóðó}
    end;
  end; {âûõîä ïî wm_quit, íà êîòîðîå GetMessage âåðíåò FALSE}
end;
//------------------------------------------





//------------------------------------------
begin
  WinMain;
end.






 ! 
MetalFan
Для оформления фрагментов исходного кода используй кнопку "КОД"



Это сообщение отредактировал(а) MetalFan - 29.12.2011, 09:10
PM MAIL   Вверх
Coder
Дата 29.12.2011, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Код, приведенный выше не смотрел (думаю понятно почему), но само по себе WM_COPYDATA прекрасно работает, если все сделать, как написано в MSDN.
PM MAIL   Вверх
MetalFan
Дата 29.12.2011, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(KlenV @  29.12.2011,  00:44 Найти цитируемый пост)
function WndProc2(hClientWnd: THandle; Msg: integer; wParam: longint; lParam: longint; var MsgV1:TWMCopyData): longint; stdcall;

что за фантазия по объявлению оконной процедуры???


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
KlenV
Дата 29.12.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



В чём именно выражается фантазия? Если только в этом  var MsgV1:TWMCopyData ? Это там действительно не нужно.
PM MAIL   Вверх
MetalFan
Дата 29.12.2011, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(KlenV @  29.12.2011,  17:31 Найти цитируемый пост)
Это там действительно не нужно. 

а зачем было тогда это выкладывать, раз это не нужно?
И что за непонятно что делающая procedure WMCopyData(var Msg: TWMCopyData); ?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
KlenV
Дата 29.12.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Код

 procedure WMCopyData(var Msg: TWMCopyData);
 var
   sText: array[0..99] of Char;
 begin

   Beep(1500,1500);// просто бип
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);//поидее должна копировать строку lpData в sText , размером cbData
   MessageBox(hClientWnd,sText,'Result',MB_OK or MB_ICONINFORMATION);// выводит бокс с присланой строкой
 end;





Эта процедура вызывается в обработчике событий , вот отсюда:


Код

case Msg of
    WM_COPYDATA:
     begin
         Beep(1500,1500);


        WMCopyData(MsgV);

     end;



И поидее всё работает нормально , за исключением того что в момент события   WM_COPYDATA:  структура:
Код

 MsgV: TWMCopyData; (которая объявлена глобально)



Абсолютно пуста и ожидаемых данных (строки и её размера) туда не заносятся. Этот вопрос и есть проблема ,который я никак не могу решить.



Что касаемо var MsgV1:TWMCopyData во входящих параметрах , то в попытке поиска решения занёс её туда, потом забыл выкинуть перед постом на форуме , за что прошу прощения если она ввела в заблуждение , но есть эта переменная там или её нет в данный момент на ход ситуации (на мой взгляд) не имеет никакого значения.

Добавлено через 2 минуты и 11 секунд
В процессе работы сообщение  WM_COPYDATA: в клиент приходит и выше описанная процедура срабатывает , но структура   MsgV: TWMCopyData пустая.

Добавлено через 9 минут и 6 секунд
 Фильтр UIPI здесь тоже не причем ,так как код был проверен и в XP  и в Win 7 , результат одинаковый. Использование  WM_COPYDATA в стандартных проектах , то есть с VLC где не надо писать свой обработчик работает на ура и без всяких проблем.
PM MAIL   Вверх
MetalFan
Дата 29.12.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



прости, но я в упор не вижу, где ты извлекаешь данные, что пришли в lParam с сообщением WM_COPYDATA  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
KlenV
Дата 29.12.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Да, действительно проблема в этом. По не знанию рыл не там. Такой вопрос, а как вытянуть эту структуру из lParam ?  
PM MAIL   Вверх
Coder
Дата 30.12.2011, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



Цитата(KlenV @ 30.12.2011,  04:55)
Да, действительно проблема в этом. По не знанию рыл не там. Такой вопрос, а как вытянуть эту структуру из lParam ?

Код

var
cds : PCopyDataStruct

....
cds:=PCopyDataStruct(_lParam);

PM MAIL   Вверх
KlenV
Дата 30.12.2011, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Блин, ребята, спасибо вам огромное,что откликнулись! Всё заработало!


Объявления данной функции вообще можно избежать , тут я действительно на фантазировал.

Код

 function WndProc2(hClientWnd: THandle; Msg: integer;
               wParam: longint; lParam: longint; var  MsgV1:TWMCopyData{MsgV1:Pointer}): longint;
               stdcall; forward;




И если не сложно , ответьте на один вопрос, почему в данный момент используется структура PCopyDataStruct , вовсех примерах , которые мне попадались , везде TWMCopyData используется , я вокруг неё и прыгал , что было не правильно?


ПыСы С наступающим Новым Годом!!!!!!

Это сообщение отредактировал(а) KlenV - 30.12.2011, 10:19
PM MAIL   Вверх
MetalFan
Дата 30.12.2011, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Почитай описание параметров сообщения WM_COPYDATA, там в wParam указатель на запись приходит.
Кстати, а написание окна на WinApi действительно необходимо? может хватит вполне VCL-ного AllocateHWND/DeallocateHWND?

Это сообщение отредактировал(а) MetalFan - 30.12.2011, 13:35


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
KlenV
Дата 30.12.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Спасибо , обязательно почитаю. Да не то что уж прям необходимо, просто задание такое в институте поставили ,что именно окно WinApi и ничего другого. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.