Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

Помогите с оконной процедурой vcl формы   Найти похожие ветки 

 
Antip   (2006-04-26 14:31) [0]

Здравствуйте уважаемые.
Подскажите пожалуйста как сделать также, как представлено ниже, но для 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;


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

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


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

попробовал, перекрыл, но при первом же сообщении вываливаеться исключение. Длл-ку и адреса функций получаю в секции 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:56) [3]

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


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

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 и ли апишной формы. незнаю.


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

ой.  про 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:32) [6]

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.043 c
15-1147258855
ArtemESC
2006-05-10 15:00
2006.06.04
Предсказатели, "пророки" и маги!


15-1146887520
Little)Lamer
2006-05-06 07:52
2006.06.04
C++


1-1145892988
Meganop
2006-04-24 19:36
2006.06.04
Вызов chm файла из Delphi


15-1146655659
Александр Б.
2006-05-03 15:27
2006.06.04
Скрипты и дизайнер форм


2-1147855038
aleshap
2006-05-17 12:37
2006.06.04
Метод





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский