Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 14.01.15 18:12 
Ein freundliches Hallo an alle,

Und wieder einmal gibt es Probleme mit der Tapi! Nachdem nun einige Hürden genommen sind, habe ich den Verdacht, das ich bei einer Tapi-Funktion die falschen Ergebnisse bekomme. Leider kann ich sie nicht mit einer funktionierenden Software vergleichen und die Handhabung der Variablen durch Delphi auf Assemblerebene habe ich auch noch nicht so ganz gepeilt.

Was funktioniert ist wählen mit einem Modem. Wenn ich das jedoch an einem Rechner mit Fritz-Karte probiere erhalte ich zwar keinen Fehler aber es passiert nichts! Die LineCallBack-Routine liefert Werte, die mir seltsam erscheinen. Nach Beschreibung sollte "dwMessage" eine Zahl unter 100 sein. Ich erhalte jedoch einen Wert der eher einem Pointer entspricht. Und das bei beiden Rechnern. Ich hoffe jemand weiß Rat!

Hier die Tapi:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    TTAPICallback = procedure(hDevice, dwMessage: DWORD; dwInstance, dwParam1,
    dwParam2, dwParam3: DWORD_PTR) stdcall;
//  +++++++++++++++ !! +++++++++++++++++++++++++++++++++++++++++++++
  {TLineCallback = procedure(hDevice, dwMessage: DWORD; dwInstance, dwParam1,
    dwParam2, dwParam3: DWORD_PTR) stdcall;}

  TLineCallback = TTAPICallback;
  LINECALLBACK = TLineCallback;
  {$EXTERNALSYM LINECALLBACK}
.
.
.
function lineInitialize(lphLineApp: PHLineApp; hInstance: HINST;
  lpfnCallback: TLineCallback; lpszAppName: LPCSTR;
  var dwNumDevs: DWORD): Longint; stdcall;
{$EXTERNALSYM lineInitialize}

In "FormCreate" werden die Geräte in einer Combobox gelistet. Dort wähle ich das Gerät, mit dem gewählt werden soll.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
procedure TForm1.FormCreate(Sender: TObject);
var
  R         : LongInt;
  DC        : Cardinal;
  I         : Integer;
  Lo, Hi, V : DWord;
  LeId      : TLineExtensionID;
  LDC       : PLineDevCaps;
  NSize     : DWord;

  aName     : array[0..500of AnsiChar;

begin
  Lo  := $00010003;   // Tapi 1.3  2.0
  Hi  := $00030000;   // Tapi 3.0
  R   := -2;

  R  := lineInitialize( @Luh, HInstance, @LineCallBack, PChar( 'Test' ), DC );
  if R = 0 then
  begin
    for I := 0 to DC-1 do
    begin
      R := lineNegotiateAPIVersion( Luh, I, Lo, Hi, V, LeId );

      if R = 0 then
      begin
        if I < 10 then foTapiV[ I ] := V;
        LDC              := AllocMem( SizeOf(TLineDevCaps) );
        LDC^.dwTotalSize := SizeOf( TLineDevCaps );
        R                := lineGetDevCaps( Luh, I, V, 0, LDC );

        if LDC^.dwTotalSize < LDC^.dwNeededSize then
        begin
          NSize := LDC^.dwNeededSize;
          FreeMem( LDC );
          LDC              := AllocMem( NSize );
          LDC^.dwTotalSize := NSize;
          R                := lineGetDevCaps( Luh, I, V, 0, LDC );
        end;
        if LDC^.dwLineNameSize > 0 then
        begin
          if LDC^.dwLineNameSize > 500 then LDC^.dwLineNameSize := 500;
          FillChar(aName, SizeOf(aName), #0);
          StrLCopy(aName,PAnsiChar(LDC)+LDC^.dwLineNameOffset,LDC^.dwLineNameSize);
          ComboBox1.Items.Add( aName );
          Memo3.Lines.Add( aName );
          Memo3.Lines.Add( 'BearerModes:       ' + IntToHex(LDC^.dwBearerModes      , 8 ) );
          Memo3.Lines.Add( 'AddressModes:      ' + IntToHex(LDC^.dwAddressModes     , 8 ) );
          Memo3.Lines.Add( 'MediaModes:        ' + IntToHex(LDC^.dwMediaModes       , 8 ) );
          Memo3.Lines.Add( 'MaxRate:           ' + IntToHex(LDC^.dwMaxRate          , 8 ) );
          Memo3.Lines.Add( 'MonitorDigitModes: ' + IntToHex(LDC^.dwMonitorDigitModes, 8 ) );
          Memo3.Lines.Add( 'Tapi Version:      ' + IntToHex( V                      , 8 ) );
          Memo3.Lines.Add( '' );
          if IsVoiceLine( LDC ) then
          begin
            foTapiVoice[ ComboBox2.Items.Count ] := I;
            ComboBox2.Items.Add( aName );
          end;
        end;
        FreeMem( LDC, LDC^.dwTotalSize );
      end;
    end;
    R   := lineShutdown( Luh );
    Luh := 0;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  lineShutdown( Luh );
end;

Per Tastendruck wird Wählen gestartet. Die Rufnummer wird einem Editfeld entnommen.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
procedure TForm1.Button2Click(Sender: TObject);
var
  CallParams : TlineCallParams;
  R          : LongInt;      
  line       : HLine;
  Luh        : HLineApp;
  lphCall    : HCall;
  DC         : Cardinal;
  V          : DWord;

begin
  if ComboBox1.ItemIndex > -1 then
  begin
    R := -2;
    V := foTapiV[ ComboBox1.ItemIndex ];
    if V = 0         then V := $00020000;
    if V < $00010003 then V := $00010003;


    FillChar(CallParams, SizeOf(CallParams), 0);
    CallParams.dwTotalSize   := sizeof(CallParams);
    CallParams.dwBearerMode  := LINEBEARERMODE_VOICE;            
    CallParams.dwAddressMode := LINEADDRESSMODE_DIALABLEADDR;    
    CallParams.dwMediaMode   := LINEMEDIAMODE_INTERACTIVEVOICE;
    CallParams.dwMinRate     := 3100;
    CallParams.dwMaxRate     := 3100;

    R  := lineInitialize( @Luh, HInstance, @LineCallBack, PChar( 'Test' ), DC );
    if R = 0 then
    begin
      if RadioGroup1.ItemIndex = 0 then                                 // Modem
        R  := lineOpen(     Luh, ComboBox1.ItemIndex, @line, V, 00,
                            LINECALLPRIVILEGE_MONITOR, 0, @CallParams)
      else                                                              // ISDN
        R  := lineOpen(     Luh, ComboBox1.ItemIndex, @line, V, 00,
                            LINECALLPRIVILEGE_NONE,                
                            LINEMEDIAMODE_INTERACTIVEVOICE, @CallParams);   

      Memo3.Lines.Add( 'lineOpen:   ' + IntToStr( ComboBox1.ItemIndex ) );
      Memo3.Lines.Add( ComboBox1.Text                                   );
      Memo3.Lines.Add( 'line:       ' + IntToHex( line, 8 )             );
      Memo3.Lines.Add( 'LineHandle: ' + IntToHex( Luh,  8 )             );
      Memo3.Lines.Add( 'Version;    ' + IntToHex( V,    8 )             );
      Memo3.Lines.Add( 'Result:      ' + IntToHex( R,    8 )             );
      Memo3.Lines.Add( '' );
      R  := lineMakeCall( line, @lphCall, PChar( Edit1.Text ),
                          0, @CallParams );

      Memo3.Lines.Add( 'lineMakeCall' );
      Memo3.Lines.Add( 'LineUHandle: '  + IntToHex( Luh,     8 ) );
      Memo3.Lines.Add( 'LineHandle:  '  + IntToHex( lphCall, 8 ) );
      Memo3.Lines.Add( 'Result:       '  + IntToHex( R,       8 ) );
      Memo3.Lines.Add( '' );
    end;
  end
  else
  begin
    showmessage( 'Bitte Gerät wählen' );
  end;
end;


Die "LineCallBack" sieht folgendermaßen aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure LineCallBack( hDev, Msg, Cbi, P1, P2, P3 : DWord );
begin
  Form1.Label6.Caption := 'Dev: '  + IntToHex( hDev, 8 ) + Char( $0D ) +
                          'Msg: '  + IntToHex( Msg,  8 ) + Char( $0D ) +
                          'Inst: ' + IntToHex( Cbi,  8 ) + Char( $0D ) +
                          'P1: '   + IntToHex( P1,   8 ) + Char( $0D ) +
                          'P2: '   + IntToHex( P2,   8 ) + Char( $0D ) +
                          'P3: '   + IntToHex( P3,   8 );
   Form1.Label6.Repaint;

   Form1.Memo3.Lines.Add( 'Message'                      );
   Form1.Memo3.Lines.Add( 'Dev:  ' + IntToHex( hDev, 8 ) );
   Form1.Memo3.Lines.Add( 'Msg:  ' + IntToHex( Msg,  8 ) );
   Form1.Memo3.Lines.Add(   GetCallBackResult( Msg     ) );
   Form1.Memo3.Lines.Add( 'Inst: ' + IntToHex( Cbi,  8 ) );
   Form1.Memo3.Lines.Add( 'P1:   ' + IntToHex( P1,   8 ) );
   Form1.Memo3.Lines.Add( 'P2:   ' + IntToHex( P2,   8 ) );
   Form1.Memo3.Lines.Add( 'P3:   ' + IntToHex( P3,   8 ) );
   Form1.Memo3.Lines.Add( '' );
end;

Die Ergebnisse bei dem Fritz-Rechner sehen folgendermaßen aus:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
Memo3
AVM ISDN Internet (PPP over ISDN)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN RAS (PPP over ISDN)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN SoftCompression X.75-V.42bis
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN Mailbox (X.75)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN - ISDN (X.75)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN FAX (G3)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN Analog Modem (V.32bis)
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

AVM ISDN Custom Config
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00007080
MonitorDigitModes: 00000000
Tapi Version:      00010004

RAS PPPoE Line0000
BearerModes:       00000008
AddressModes:      00000003
MediaModes:        00000100
MaxRate:           00000000
MonitorDigitModes: 00000000
Tapi Version:      00010003

RAS-VPN-Leitung 0
BearerModes:       00000008
AddressModes:      00000003
MediaModes:        00000100
MaxRate:           00000000
MonitorDigitModes: 00000000
Tapi Version:      00010003

ISDN - Line0000
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000100
MaxRate:           0000FA00
MonitorDigitModes: 00000000
Tapi Version:      00010004

ISDN - Line0001
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000100
MaxRate:           0000FA00
MonitorDigitModes: 00000000
Tapi Version:      00010004

WAN-Miniport (L2TP)
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000102
MaxRate:           00989680
MonitorDigitModes: 00000000
Tapi Version:      00010004

LPT1
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000102
MaxRate:           003D0900
MonitorDigitModes: 00000000
Tapi Version:      00010004

IPCONF-Leitung
BearerModes:       00000009
AddressModes:      00000001
MediaModes:        0000000E
MaxRate:           00100000
MonitorDigitModes: 00000000
Tapi Version:      00010004

H323-Leitung
BearerModes:       00000009
AddressModes:      00000001
MediaModes:        0000000E
MaxRate:           00100000
MonitorDigitModes: 00000002
Tapi Version:      00010004

AVM ISDN TAPI Services (Cntrl 1)
BearerModes:       0000000D
AddressModes:      00000003
MediaModes:        0000002C
MaxRate:           0000FA00
MonitorDigitModes: 00000002
Tapi Version:      00010004

AVM ISDN TAPI Services (Cntrl 1)
BearerModes:       0000000D
AddressModes:      00000003
MediaModes:        0000002C
MaxRate:           0000FA00
MonitorDigitModes: 00000002
Tapi Version:      00010004

lineOpen:   16
AVM ISDN TAPI Services (Cntrl 1)
line:       000101CD
LineHandle: 800003DD
Version;    00010003
Result:      00000000

lineMakeCall
LineUHandle: 800003DD
LineHandle:  00010189
Result:       000101AB

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDF4
P1:   00000000
P2:   0000000C
P3:   00000000

L7: Label7
L8: Label8
L9: Label9


Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDE8
P1:   00000000
P2:   00000002
P3:   00010189

L7: Label7
L8: Label8
L9: UNKNOWN


Dial
0047527519
Res: 80000018

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDDC
P1:   00000000
P2:   00000002
P3:   00010189

L7: Label7
L8: Label8
L9: UNKNOWN


Dial
0047527519
Res: 80000018

Das Modem liefert diese Ergebnisse (und wählt):

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
Memo3
Standard 14400 bps Modem
BearerModes:       00000041
AddressModes:      00000001
MediaModes:        00000014
MaxRate:           00003840
MonitorDigitModes: 00000000
Tapi Version:      00010004

RAS PPPoE Line0000
BearerModes:       00000008
AddressModes:      00000003
MediaModes:        00000100
MaxRate:           00000000
MonitorDigitModes: 00000000
Tapi Version:      00010003

RAS-VPN-Leitung 0
BearerModes:       00000008
AddressModes:      00000003
MediaModes:        00000100
MaxRate:           00000000
MonitorDigitModes: 00000000
Tapi Version:      00010003

WAN-Miniport (L2TP)
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000102
MaxRate:           00989680
MonitorDigitModes: 00000000
Tapi Version:      00010004

LPT1
BearerModes:       00000008
AddressModes:      00000001
MediaModes:        00000102
MaxRate:           003D0900
MonitorDigitModes: 00000000
Tapi Version:      00010004

IPCONF-Leitung
BearerModes:       00000009
AddressModes:      00000001
MediaModes:        0000000E
MaxRate:           00100000
MonitorDigitModes: 00000000
Tapi Version:      00010004

H323-Leitung
BearerModes:       00000009
AddressModes:      00000001
MediaModes:        0000000E
MaxRate:           00100000
MonitorDigitModes: 00000002
Tapi Version:      00010004

lineOpen:   0
Standard 14400 bps Modem
line:       00010301
LineHandle: 800003DD
Version;    00010004
Result:      00000000

lineMakeCall
LineUHandle: 800003DD
LineHandle:  5D456041
Result:       000102F0

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDF4
P1:   00000000
P2:   0000000C
P3:   00000000

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDE8
P1:   00000000
P2:   00000002
P3:   000102DE

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDDC
P1:   00000000
P2:   00000002
P3:   000102DE

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDF4
P1:   00000000
P2:   00000002
P3:   000102DE

Message
Dev:  00000001
Msg:  7C91E514

Inst: 0012FDE8
P1:   00000000
P2:   00000002
P3:   000102DE


"dwMessage" hat den Wert "7C91E514". Das entspricht aber nicht den in der Tapi.pas angegebenen Werten. Auch im Buch sieht das anders aus. Daher bin ich mir nicht sicher, was ich mit den Werten anfngen kann. Ich hoffe jemand hat einen Tipp, was hier faul ist!

Grüße von der Nordsee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 14.01.15 18:30 
Ein freundliches Hallo an alle,

bin inzwischen auf die Lösung gestoßen! Nun sind die Ergebnisse in Ordnung.

ausblenden Delphi-Quelltext
1:
procedure LineCallBack( hDev, Msg, Cbi, P1, P2, P3 : DWord );  stdcall;					

"stdcall;" fehlte bei der procedure!


Grüße von der Nordsee

Peter