AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Api's von VB auf Delphi

Ein Thema von magicshadow · begonnen am 2. Mai 2003 · letzter Beitrag vom 3. Mai 2003
Antwort Antwort
Seite 1 von 2  1 2      
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#1

Api's von VB auf Delphi

  Alt 2. Mai 2003, 16:42
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!
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 2. Mai 2003, 18:45
Es fehlen vermutlich einige Deklarationen:
RASSTATS2000
RASStatusType
RASType

Chris
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#3
  Alt 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;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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.dllname 'RasEnumConnectionsA';
  {$ELSE}
    function RasEnumConnections(const lprasconn : PRASCONN;const lpcb : PDWORD;const lpcconnections : PDWORD) : DWORD; stdcall; external 'RasApi32.dllname '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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#5
  Alt 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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6
  Alt 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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#8
  Alt 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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#10
  Alt 3. Mai 2003, 13:19
Nein, ich habe nur eine RAS Verbindung (Mein DSL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz