Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с оконной процедурой vcl формы [D7, WinXP]


Antip ©   (2006-04-26 14:31:00) 

Здравствуйте уважаемые.
Подскажите пожалуйста как сделать также, как представлено ниже, но для vcl формы. Просто есть длл-ка написанная на си, в которой есть экспортная функция CWndProc, которая также обрабатывает сообщения главной оконной процедуры и она спокойно работает вкупе с формой написанной в дельфи, но на вин апи. Совсем не ясно как это должно выглядеть для vcl формы. CWndProc должна срабатывать именно после дефолтовой оконной функции. Спасибо.

function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam; lParam: lParam): LRESULT; stdcall; export;
var   ps: TPaintStruct;
begin
  Result := 0;
  case Msg of
    WM_PAINT:
      begin
        BeginPaint(hWindow, ps);
        EndPaint(hWindow, ps);
      end;
    WM_DESTROY:
      begin
       PostQuitMessage(0);
      end;
    else
      Result := DefWindowProc(hWindow, Msg, wParam, lParam);
  end;//case
  Result := CWndProc(hWindow, Msg, wParam, lParam, Result);
end;


Antip   (2006-04-26 15:32:00) [1]

В общем решилось это дело с помощью замены stdcall на cdecl, хоть и непонятно почему работало все в вин апишной форме.


Antip   (2006-04-26 15:16:00) [2]

ой.  про 3-й пункт я не добавил.
в сишной длл:
extern "C" NEWLIB_API LRESULT CWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT lRes );

в vcl проекте объявляю так
 TWndFunc   = function (mHwnd: HWND; Msg: UINT; WParam: WPARAM; lParam: LPARAM; lRes: LRESULT): integer; stdcall;


Antip   (2006-04-26 15:14:00) [3]

1. убрал, результатов не дало.
2. AV at address 00000000
3. в dll
4. @CWndProc := GetProcAddress(lHandle, 'CWndProc');
   if (@CWndProc = nil) then Showmessage('c wnd proc not found');


вот думаю может зависит от того кака я вызываю функцию эту.
сейчас в винапи версии вызываю через stdcall. может есть разница в вызовах при использовании vcl и ли апишной формы. незнаю.


Юрий Зотов   (2006-04-26 14:56:00) [4]

1. Form1 - убрать. Оставить просто Handle.
2. Что сообщает исключение?
3. Как объявлена CWndProc в DLL и в Eхe?
4. Как Exe получает ее адрес? Он точно не нулевой?


Antip   (2006-04-26 14:44:00) [5]

попробовал, перекрыл, но при первом же сообщении вываливаеться исключение. Длл-ку и адреса функций получаю в секции initialization, т.к. думаю это правильней будет, пока первые сообщения не начали приходить. Слаб я в vcl, потому может что не понимаю.


procedure TForm1.WndProc(var Msg: TMessage);
begin
 inherited;

 with Msg do
   Result := CWndProc(Form1.Handle, Msg, wParam, lParam, Result);
end;


Юрий Зотов   (2006-04-26 14:34:00) [6]

Заместить метод WndProc, там вызвать сначала inherited, а потом CWndProc.


Наверх

Титульная страница Поиск, карта сайта Написать письмо