![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить WM_RASDIALEVENT? [D6, WinXP]
Separator © (2005-01-25 15:57:00)
const
WM_RASDIALEVENT = $CCCD;
TfrmMain = class(TForm)
private
procedure RasDialFunc(var Message: TMessage); message WM_RASDIALEVENT;
Ругается так: Illegal message method index
Digitman (2005-01-26 09:16:00) [1]
> Separator © (25.01.05 16:27) [4]
> Но не я ведь её придумал
понятно что не ты ..
но справку-то читать нужно внимательно, согласен ?
вот ты пишешь
RasDial(..., 0, @RasDialFuncF, ..);
раз этот параметр (dwNotifierType) равен нулю, значит при наступлении RAS-события будет вызываться callback-функция, адрес которой ты передал (@RasDialFuncF), т.е. никакие procedure RasDialFunc(var Message: TMessage); message WM_RASDIALEVENT; тебе вовсе не нужны
Jel (2005-01-25 17:30:00) [2]RasDialFuncF объяви как stdcall. Это правило касается любых callback-ов вызываемых из API.
Separator (2005-01-25 16:27:00) [3]Но не я ведь её придумал. Я вообще использую модуль RAS, мне вызвать дозвон. Для этого я пишу так:
function TfrmMain.Dial;
var
Err: Longint;
RDParams: TRasDialParams;
begin
Result:= false;
RDParams.dwSize:= SizeOf(TRasDialParams);
StringToArray(Name, RDParams.szEntryName);
StringToArray(IntToStr(edNumber.AsInteger), RDParams.szPhoneNumber);
StringToArray('', RDParams.szCallbackNumber);
StringToArray(edUser.Text, RDParams.szUserName);
StringToArray(edPswd.Text, RDParams.szPassword);
StringToArray('', RDParams.szDomain);
Err:= RasDial(nil, nil, RDParams, 0, @RasDialFuncF, fHRasConn);
if Err = SUCCESS then Result:= true
end;
функция RasDial имеет такой код:
function RasDial(
lpRasDialExt: LPRasDialExtensions;
lpszPhoneBook: PChar;
var params: TRasDialParams;
dwNotifierType: Longword;
lpNotifier: Pointer;
var rasconn: THRasConn
): Longint;
begin
if bRasAvail and (@_RasDialA <> nil) then
Result := _RasDialA(lpRasDialExt, lpszPhoneBook, params, dwNotifierType,
lpNotifier, rasconn)
else
Result := -1;
end;
В качестве параметра lpNotifier можно передать ссылку на процедуру, такого типа:
void CALLBACK RasDialFunc(
UINT unMSG,
RASCONNSTATE rasconnstate,
DWORD dwError
);
RASCONNSTATE это просто Integer. Описываю функцию так:
function RasDialFuncF(const unMsg: UINT; const RasConnState: TRasConnState; const dwError: DWORD): Longint;
При запуске у меня вываливется окошко CPU с ошибкой Access Violation.
Что я делаю не правильно?
begin...end (2005-01-25 16:11:00) [4]> [2] Separator © (25.01.05 16:10)
Уменьшить константу WM_RASDIALEVENT.
Separator (2005-01-25 16:10:00) [5]Это я понял, но как мне тогда быть?
begin...end (2005-01-25 16:04:00) [6]> Separator © (25.01.05 15:57)
Из справки (Message methods):
A message method is created by including the message directive in a method declaration, followed by an integer constant between 1 and 49151which specifies the message ID.