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

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

Как отловить 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.


Наверх

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