Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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:
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 = 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.
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..500] of AnsiChar;
begin Lo := $00010003; Hi := $00030000; 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.
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 R := lineOpen( Luh, ComboBox1.ItemIndex, @line, V, 0, 0, LINECALLPRIVILEGE_MONITOR, 0, @CallParams) else R := lineOpen( Luh, ComboBox1.ItemIndex, @line, V, 0, 0, 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:
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:
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):
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
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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.
Delphi-Quelltext 1:
| procedure LineCallBack( hDev, Msg, Cbi, P1, P2, P3 : DWord ); stdcall; |
"stdcall;" fehlte bei der procedure!
Grüße von der Nordsee
Peter
|
|
|