Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Api's von VB auf Delphi (https://www.delphipraxis.net/4515-apis-von-vbulletin-auf-delphi.html)

magicshadow 2. Mai 2003 16:42


Api's von VB auf Delphi
 
Kann mir jemand beim Umschreiben von 2 Apifunktionen helfen?
Ich möchte:
Code:
Private Declare Function RasEnumConnections Lib "RasApi32.DLL" _
        Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As _
        Long, lpcConnections As Long) As Long
       
Private Declare Function RasGetConnectionStatistics Lib _
        "RasApi32.DLL" (ByVal hRasConn As Long, lpStatistics _
        As RASSTATS2000) As Long
in delphi nutzen.

mein Versuch war:

Code:
Function RasGetConnectionStatistics(hRasConn:Longint;
         var lpStatistics:RASSTATS2000):longint; stdcall; external 'RasApi32.DLL'

Function RasEnumConnectionsA(lpRasCon:RASType; lpcb:Longint;
         lpcConnections:Longint):longint; stdcall; external 'RasApi32.DLL'
leider scheint da ein kleiner deklarationsfehler zu sitzen. Der anschließende Aufruf bringt irgendwie nicht das Result, was unter VB erwartet wird.

Miene Procedur:
Code:
procedure TForm1.Timer1Timer(Sender: TObject);
var RAS:array[0..255] of RASType;
    RASStatus:RASStatusType;
    lg,lpcon,Result:longint;
    myStats:RASSTATS2000;
    rtn:Longint;
    tmp:longint;
begin
     lpcon:=0;
     lg:=0;
     RAS[0].dwSize:= 412;
     lg:= 256 * RAS[0].dwSize;
     tmp:= RasEnumConnectionsA(RAS[0], lg, lpcon);
     showmessage(inttostr(lpcon));
     myStats.dwSize:= SizeOf(myStats);
     rtn:= RasGetConnectionStatistics(RAS[0].hRasCon, myStats);
     edit1.text:=inttostr(myStats.dwBytesXmited);
     edit2.text:=inttostr(mystats.dwBytesRcved);
end;
Diese Procedur sollte eigentlich die gesendeten und empfangenen bytes einer Win2k DFÜ Verbindung auf Edit1 und edit2 setzen, leider bleiben diese Variablen bei 0.

Bin für jeden Hinweis dankbar! :coder:

CalganX 2. Mai 2003 18:45

Es fehlen vermutlich einige Deklarationen:
RASSTATS2000
RASStatusType
RASType

Chris

magicshadow 2. Mai 2003 19:52

nein, die Deklarationen sind da!
ich poste mal die volständigen quellcodes:
VB:
Code:
Private Declare Function RasGetConnectionStatistics Lib _
        "RasApi32.DLL" (ByVal hRasConn As Long, lpStatistics _
        As RASSTATS2000) As Long
           
Private Declare Function RasEnumConnections Lib "RasApi32.DLL" _
        Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As _
        Long, lpcConnections As Long) As Long
       


Private Type RASSTATS2000
  dwSize As Long
  dwBytesXmited As Long
  dwBytesRcved As Long
  dwFramesXmited As Long
  dwFramesRcved As Long
  dwCrcErr As Long
  dwTimeoutErr As Long
  dwAlignmentErr As Long
  dwHardwareOverrunErr As Long
  dwFramingErr As Long
  dwBufferOverrunErr As Long
  dwCompressionRatioIn As Long
  dwCompressionRatioOut As Long
  dwBps As Long
  dwConnectDuration As Long
End Type

Const RAS_MaxEntryName = 256
Const RAS_MaxDeviceType = 16
Const RAS_MaxDeviceName = 32

Private Type RASType
  dwSize As Long
  hRasCon As Long
  szEntryName(RAS_MaxEntryName) As Byte
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Type RASStatusType
  dwSize As Long
  RasConnState As Long
  dwError As Long
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
  szInBytes As Double
  syOutbytes As Double
End Type

Private Sub Timer1_Timer()
  Call ActiveConnection
End Sub

Private Function ActiveConnection() As Boolean
  Dim RAS(255) As RASType, RASStatus As RASStatusType
  Dim lg&, lpcon&, Result&
  Dim myStats As RASSTATS2000
  Dim rtn As Long
    RAS(0).dwSize = 412
    lg = 256 * RAS(0).dwSize
    Result = RasEnumConnections(RAS(0), lg, lpcon)
    myStats.dwSize = LenB(myStats)
    rtn = RasGetConnectionStatistics(RAS(0).hRasCon, myStats)
    ActiveConnection = True
        Form1.Text1 = myStats.dwBytesRcved - Label2.Caption
        Form1.Label2.Caption = myStats.dwBytesRcved
        Form1.Label1.Caption = myStats.dwBytesXmited
End Function
Delphi:
Code:
type
RASSTATS2000 = record
  dwSize:Longint;
  dwBytesXmited:Longint;
  dwBytesRcved:Longint;
  dwFramesXmited:Longint;
  dwFramesRcved:Longint;
  dwCrcErr:Longint;
  dwTimeoutErr:Longint;
  dwAlignmentErr:Longint;
  dwHardwareOverrunErr:Longint;
  dwFramingErr:Longint;
  dwBufferOverrunErr:Longint;
  dwCompressionRatioIn:Longint;
  dwCompressionRatioOut:Longint;
  dwBps:Longint;
  dwConnectDuration:Longint;
End;

RASType = record
  dwSize:Longint;
  hRasCon:Longint;
  szEntryName:array[0..256] of Byte;
  szDeviceType:array[0..16] of Byte;
  szDeviceName:array[0..32] of Byte;
End;

RASStatusType = record
  dwSize:Longint;
  RasConnState:Longint;
  dwError:Longint;
  szDeviceType:array[0..16] of byte;
  szDeviceName:array[0..32] of Byte;
  szInBytes:Double;
  syOutbytes:Double
End;

Const RAS_MaxEntryName = 256;
      RAS_MaxDeviceType = 16;
      RAS_MaxDeviceName = 32;

{$R *.DFM}
Function RasGetConnectionStatistics(hRasConn:Longint;
         var lpStatistics:RASSTATS2000):longint; stdcall; external 'RasApi32.DLL'

Function RasEnumConnectionsA(lpRasCon:RASType; lpcb:Longint;
         lpcConnections:Longint):longint; stdcall; external 'RasApi32.DLL'

procedure TForm1.Timer1Timer(Sender: TObject);
var RAS:array[0..255] of RASType;
    RASStatus:RASStatusType;
    lg,lpcon,Result:longint;
    myStats:RASSTATS2000;
    rtn:Longint;
    tmp:longint;
begin
     lpcon:=0;
     lg:=0;
     RAS[0].dwSize:= 412;
     lg:= 256 * RAS[0].dwSize;
     tmp:= RasEnumConnectionsA(RAS[0], lg, lpcon);
     showmessage(inttostr(lpcon));
     myStats.dwSize:= SizeOf(myStats);
     rtn:= RasGetConnectionStatistics(RAS[0].hRasCon, myStats);
     edit1.text:=inttostr(myStats.dwBytesXmited);
     edit2.text:=inttostr(mystats.dwBytesRcved);
end;

Christian Seehase 3. Mai 2003 00:46

Moin magicshadow,

bei mir sehen die Deklarationen so aus:

Delphi-Quellcode:
// aus RAS.H
const
  RAS_MaxDeviceType = 16;
  RAS_MaxEntryName = 256;
  RAS_MaxDeviceName = 128;

  // aus RASERROR.H
  RASBASE               = 600;
  ERROR_BUFFER_TOO_SMALL = RASBASE+3;

type
  {$IFNDEF UNICODE}
    TCHAR = type Char;
  {$ELSE}
    TCHAR = type WideChar;
  {$ENDIF}

  PRAS_STATS = ^RAS_STATS;
  RAS_STATS = packed record
   dwSize               : DWORD;
   dwBytesXmited        : DWORD;
   dwBytesRcved         : DWORD;
   dwFramesXmited       : DWORD;
   dwFramesRcved        : DWORD;
   dwCrcErr             : DWORD;
   dwTimeoutErr         : DWORD;
   dwAlignmentErr       : DWORD;
   dwHardwareOverrunErr : DWORD;
   dwFramingErr         : DWORD;
   dwBufferOverrunErr   : DWORD;
   dwCompressionRatioIn : DWORD;
   dwCompressionRatioOut : DWORD;
   dwBps                : DWORD;
   dwConnectDuration    : DWORD;
  end;

  PRASCONN = ^RASCONN;
  RASCONN = record
    dwSize      : DWORD;
    hrasconn    : DWORD;
    szEntryName : array [1..RAS_MaxEntryName+1] of TCHAR;
    szDeviceType : array [1..RAS_MaxDeviceType+1] of TCHAR;
    szDeviceName : array [1..RAS_MaxDeviceName+1] of TCHAR;
    szPhonebook : array [1..MAX_PATH] of TCHAR;
    dwSubEntry  : DWORD;
    guidEntry   : TGUID;
 end;

  function RasGetConnectionStatistics(const hRasConn : DWORD;const lpStatistics : PRAS_STATS) : DWORD; stdcall; external 'RasApi32.dll';

  function RasEnumConnectionsA(const lprasconn : PRASCONN;const lpcb : PDWORD;const lpcconnections : PDWORD) : DWORD; stdcall; external 'RasApi32.dll';
  function RasEnumConnectionsW(const lprasconn : PRASCONN;const lpcb : PDWORD;const lpcconnections : PDWORD) : DWORD; stdcall; external 'RasApi32.dll';

  {$IFNDEF UNICODE}
    function RasEnumConnections(const lprasconn : PRASCONN;const lpcb : PDWORD;const lpcconnections : PDWORD) : DWORD; stdcall; external 'RasApi32.dll' name 'RasEnumConnectionsA';
  {$ELSE}
    function RasEnumConnections(const lprasconn : PRASCONN;const lpcb : PDWORD;const lpcconnections : PDWORD) : DWORD; stdcall; external 'RasApi32.dll' name 'RasEnumConnectionsW';
  {$ENDIF}
Und, zum Testen hab' ich das dann so verwendet:

Delphi-Quellcode:
var
  prcWork      : PRASCONN;
  dwResult     : DWORD;
  dwSize       : DWORD;
  dwConnections : DWORD;

begin
  dwSize := SizeOf(RASCONN);
  prcWork := AllocMem(SizeOf(RASCONN));
  try
    dwConnections := 0;
    prcWork.dwSize := SizeOf(RASCONN);
    dwResult      := RasEnumConnections(prcWork,@dwSize,@dwConnections);
    if (dwResult = ERROR_BUFFER_TOO_SMALL) or (dwResult = ERROR_NOT_ENOUGH_MEMORY) then
    begin
      MessageBox(0,'Buffer reicht nicht','RasEnumConnections',MB_ICONERROR);
      exit;
    end;
    if dwResult <> ERROR_SUCCESS then
    begin
      MessageBox(0,PChar('RAS Fehler: '+IntToStr(dwResult)+' aufgetreten'),'RasEnumConnections',MB_ICONERROR);
      exit;
    end;
    // Ab hier kann weiterverarbeitet werden
  finally
    FreeMem(prcWork,SizeOf(RASCONN));
  end;
In Ermangelung einer RAS Verbindung bekomme ich zwar leider auch keine Verbindungen aufgezählt (was den Test von RasGetConnectionStatistics doch leicht erschwert ;-) ), aber der Return Code ist 0, hat also geklappt.

Die Hauptunterschiede:
RAS_MaxDeviceName hat die Länge 128, nicht 32.
Ausserdem stimmt die Struktur für RASCONN nicht, diese muss unter W2K länger sein.

magicshadow 3. Mai 2003 06:41

THX, das sieht schonmal nach was aus!
Nur welchen Wert muß ich der Funktion:
Code:
function RasGetConnectionStatistics(const hRasConn : DWORD;const lpStatistics : PRAS_STATS) : DWORD; stdcall; external 'RasApi32.dll';
als hRasConn übergeben?
Ich hab jetzt einiges probiert, ich bekomm immer Zahlen zurück (in der PRAS_STATS welche nicht real sind (und sich auch nciht verändern, wenn Daten über die Verbindung gesendet/empfangen werden.

jbg 3. Mai 2003 09:50

hRasConn = RAS Connection Handle.
Dieses bekommst du z.B. über RasDial, was eine DFÜ-Verbindung aufbaut.

Es gibt bereits eine komplette ras.h Header-Übersetzung.

Christian Seehase 3. Mai 2003 10:44

Moin magicshadow,

mit der RasEnumConnections Funktion bekommst Du ein Array von RASCONN Strukturen zurück. Das zweite Feld davon ist hrasconn.

Diese und weitere Informationen kannst Du übrigens auch aus dem PSDK bekommen. Da der Download sehr gross werden kann: Such' doch mal hier im Forum nach PSDK, da sollte es einige Fundstellen, über die Möglichkeiten geben.

magicshadow 3. Mai 2003 11:53

So funktioniert das auch in VB, nur eben in Delphi nicht (jedenfals bei mir) Ich bekomm jetzt zwar Werte zurück(für dwBytesXmited und wBytesRcved), jedoch sind diese konstant (auch nachdem Daten über die Verbindung gesendet wurden).

Hat das mel wer probiert, bei dem es funktioniert hat?

PS: In den PSDK (sind doch die MSDN, oder?) steht auch nur das, was bei VB funktioniert. :(

Christian Seehase 3. Mai 2003 12:40

Moin magicshadow,

kann es sein, dass Du mehrere RAS Verbindungen hast, und immer eine abfragst, bei der sich nichts ändert?

magicshadow 3. Mai 2003 13:19

Nein, ich habe nur eine RAS Verbindung (Mein DSL)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz