Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 28.11.14 14:52
Ein freundliches Hallo an alle,
ich möchte sehen, ob die verfügbare Hardware auch über die Tapi angesprochen werden kann. Dazu möchte ich " lineGetDevCaps" verwenden und die Namen der verfügbaren Geräte auflisten. In Pascal werden die Dinge aber etwas anders gehandhabt als in C. Mein Problem ist nun die dynamische Größe von " TLineDevCaps" zu managen. Der Aufruf von " lineGetDevCaps" liefert "LINEERR_STRUCTURETOOSMALL 0x8000004D". Das heißt es müssen Speicherbereiche für die einzutragenden Informationen angefügt werden. In C wird die Struktur mit "realloc" vergrößert.
Geht das auch in Delphi 4 so einfach oder ist dabei etwas zu beachten?
Hier das Programm:
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:
| procedure TForm1.Button1Click(Sender: TObject); const LINEINITIALIZEEXOPTION_USECOMPLETIONPORT = 0; var I : Integer; R : LongInt; Luh : HLineApp; LDC : TLineDevCaps; DC, Tv : Cardinal; Lo, Hi, V : DWord; LeId : TLineExtensionID;
begin Lo := $00010003; Hi := $00030000; R := -2;
FillChar(Par, SizeOf(Par), 0); FillChar(LDC, SizeOf(LDC), 0); Par.dwTotalSize := SizeOf( Par ); Par.dwOptions := 2; LDC.dwTotalSize := SizeOf( Par );
R := lineInitialize( @Luh, HInstance, @LineCallBack, PChar( 'Test' ), DC ); ShowMessage( 'Result: ' + Inttostr( R ) + Char( $0D ) + 'Hex: ' + IntToHex( R, 8 ) ); 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 R := lineGetDevCaps( Luh, I, V, 0, @LDC ); end; end; R := lineShutdown( Luh ); end; end; |
Grüße von der Nordsee
Peter
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 09.01.15 14:39
So funktioniert es!
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:
| 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 ); if IsVoiceLine( LDC ) then begin foTapiVoice[ ComboBox2.Items.Count ] := I; ComboBox2.Items.Add( aName ); end; end; FreeMem( LDC, LDC^.dwTotalSize ); end; end; Memo1.Lines := ComboBox2.Items; R := lineShutdown( Luh ); Luh := 0; end; end; |
Grüße von der Nordsee
Peter
|
|
|