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


Delphi4
BeitragVerfasst: 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:
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:
procedure TForm1.Button1Click(Sender: TObject);
const
  LINEINITIALIZEEXOPTION_USECOMPLETIONPORT = 0;
var
  I   : Integer;
  R   : LongInt;       // 32 Bit mit Vorzeichen
  Luh       : HLineApp;     //    P
  LDC       : TLineDevCaps;
  DC, Tv    : Cardinal;
  Lo, Hi, V : DWord;
  LeId      : TLineExtensionID;

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

  FillChar(Par, SizeOf(Par), 0);
  FillChar(LDC, SizeOf(LDC), 0);
  Par.dwTotalSize := SizeOf( Par );
  Par.dwOptions   := 2;             // LINEINITIALIZEEXOPTION_USEEVENT
  LDC.dwTotalSize := SizeOf( Par );

  R  := lineInitialize( @Luh, HInstance, @LineCallBack, PChar( 'Test' ), DC );  //    LineCallBack  @Par
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 09.01.15 14:39 
So funktioniert es!

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:
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
  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 );
           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