Особые благодарности Королеве дельфийского королевства Елене Филипповой, которая подвигла меня на ваяние сего опуса.

 Вместо предисловия

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

 

S0 Звонок, на который необходимо ответить (Ring After Which To Answer)

S1 Количество звонков (Ring Count)

S2 Символ отмены (Hayes Escape Character)

S3 Символ перевода строки (Carriage Return Character)

После предварительной настройки переменных, COM порт открывается как обычный файл. Так же пример показывает, как очищать буфер COM порта и читать из него.

 

How can I use TAPI to dial the telephone for a voice call?

 The following example shows how to interface with tapi to make a voice call.

Следующий пример демонстрирует получение состояния управляющих регистров модема.

 

Пример:

A        Команда ответа (Answer Command)        

Bn        Настройка связи (Communications Options)        

D        Команда набора (Dial Command)        

En        Команда выбора символа эха (Select Command Character Echo Option)        

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var cmd, par, fil, dir: PChar;

begin

Cmd := 'open';

Fil := 'rasdial.exe';

Par := PChar(edtEntry.Text + ' ' + EdtUser.Text + ' ' + EdtPass.Text);

Dir := 'C:';

ShellExecute(Handle, Cmd, Fil, Par, Dir, SW_SHOWMINNOACTIVE);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var Cmd, Par, Fil, Dir: PChar;

begin

Cmd := 'open';

Fil := 'rasdial.exe';

Par := PChar(EdtEntry.Text + ' /DISCONNECT');

Dir := 'C:';

ShellExecute(Handle, Cmd, Fil, Par, Dir, SW_SHOWMINNOACTIVE);

end;

Code:

unit PortInfo;

 

interface

 

uses Windows, SysUtils, Classes, Registry;

 

function EnumModems: TStrings;

 

implementation

 

function EnumModems: TStrings;

var

R: TRegistry;

s: ShortString;

N: TStringList;

i: integer;

j: integer;

begin

Result := TStringList.Create;

R := TRegistry.Create;

try

   with R do

     begin

       RootKey := HKEY_LOCAL_MACHINE;

       if OpenKey('\System\CurrentControlSet\Services\Class\Modem', False) then

         if HasSubKeys then

           begin

             N := TStringList.Create;

             try

               GetKeyNames(N);

               for i := 0 to N.Count - 1 do

                 begin

                   closekey; { + }

                   openkey('\System\CurrentControlSet\Services\Class\Modem', false); { + }

                   OpenKey(N[i], False);

                   s := ReadString('AttachedTo');

                   for j := 1 to 4 do

                     if Pos(Chr(j + Ord('0')), s) > 0 then

                       Break;

                   Result.AddObject(ReadString('DriverDesc'), TObject(j));

                   CloseKey;

                 end;

             finally

               N.Free;

             end;

           end;

     end;

finally

   R.Free;

end;

end;

 

end.

 

 

Code:

var

hCommFile : THandle;

 

procedure TForm1.Button1Click(Sender: TObject);

var

PhoneNumber : string;

CommPort : string;

NumberWritten : LongInt;

begin

PhoneNumber := 'ATDT 1-555-555-1212' + #13 + #10;

CommPort := 'COM2';

{Open the comm port}

hCommFile := CreateFile(PChar(CommPort),

GENERIC_WRITE,

0,

nil,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

0);

if hCommFile=INVALID_HANDLE_VALUE then

begin

ShowMessage('Unable to open '+ CommPort);

exit;

end;

NumberWritten:=0;

if WriteFile(hCommFile,

PChar(PhoneNumber)^,

Length(PhoneNumber),

NumberWritten,

nil) = false then

begin

    ShowMessage('Unable to write to ' + CommPort);

   end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

{Close the port}

CloseHandle(hCommFile);

end;