Форум: "Основная";
Текущий архив: 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.049 c