![]() |
Api's von VB auf Delphi
Kann mir jemand beim Umschreiben von 2 Apifunktionen helfen?
Ich möchte:
Code:
in delphi nutzen.
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 mein Versuch war:
Code:
leider scheint da ein kleiner deklarationsfehler zu sitzen. Der anschließende Aufruf bringt irgendwie nicht das Result, was unter VB erwartet wird.
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' Miene Procedur:
Code:
Diese Procedur sollte eigentlich die gesendeten und empfangenen bytes einer Win2k DFÜ Verbindung auf Edit1 und edit2 setzen, leider bleiben diese Variablen bei 0.
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; Bin für jeden Hinweis dankbar! :coder: |
Es fehlen vermutlich einige Deklarationen:
RASSTATS2000 RASStatusType RASType Chris |
nein, die Deklarationen sind da!
ich poste mal die volständigen quellcodes: VB:
Code:
Delphi:
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
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; |
Moin magicshadow,
bei mir sehen die Deklarationen so aus:
Delphi-Quellcode:
Und, zum Testen hab' ich das dann so verwendet:
// 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}
Delphi-Quellcode:
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.
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; 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. |
THX, das sieht schonmal nach was aus!
Nur welchen Wert muß ich der Funktion:
Code:
als hRasConn übergeben?
function RasGetConnectionStatistics(const hRasConn : DWORD;const lpStatistics : PRAS_STATS) : DWORD; stdcall; external 'RasApi32.dll';
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. |
hRasConn = RAS Connection Handle.
Dieses bekommst du z.B. über RasDial, was eine DFÜ-Verbindung aufbaut. Es gibt bereits eine komplette ras.h ![]() |
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. |
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. :( |
Moin magicshadow,
kann es sein, dass Du mehrere RAS Verbindungen hast, und immer eine abfragst, bei der sich nichts ändert? |
Nein, ich habe nur eine RAS Verbindung (Mein DSL)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr. |
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