Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem beim Laden einer DLL zur Laufzeit (https://www.delphipraxis.net/5380-problem-beim-laden-einer-dll-zur-laufzeit.html)

magicshadow 4. Jun 2003 09:26


Problem beim Laden einer DLL zur Laufzeit
 
Hallöchen!
Ich hab ein "kleines" Problem mit dem Laden einer DLL.

mal direkt meine codes:

gleichbleibende Deklarationen:
Code:
const
  RAS_MaxDeviceType = 16;
  RAS_MaxEntryName = 256;
  RAS_MaxDeviceName = 128;
type
{$IFNDEF UNICODE}
    TCHAR = type Char;
  {$ELSE}
    TCHAR = type WideChar;
  {$ENDIF}
  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;

 PRasConnA = ^PRasConn;
 PRasConnW = ^PRasConn;
 PRasConn = record
    dwSize      : DWORD;
    hrasconn    : DWORD;
    szEntryName : array [0..RAS_MaxEntryName] of Char;
    szDeviceType : array [0..RAS_MaxDeviceType] of Char;
    szDeviceName : array [0..RAS_MaxDeviceName] of Char;
 end;
Die eigentliche Funktion:(bleibt gleich)
Code:
Procedure GetSystemParams;
var Res,lpcb,NumberOfEntries :DWORD;
    Entries                 :array[0..255] of PRasConn;
    mystats                 :RAS_STATS;
    i                       :DWORD;
    bytesdown,bytesup       :Cardinal;
begin
 Entries[0].dwsize:=412;
 lpcb:=256*Entries[0].dwsize;
 NumberOfEntries:=0;
 Res := RasEnumConnections(Entries[0], lpcb, NumberOfEntries);
 mystats.dwsize:=sizeof(mystats);
 bytesup:=0;
 bytesdown:=0;
 for i:=0 to NumberOfEntries-1 do begin
    Res:= RasGetConnectionStatistics(Entries[i].hrasconn,mystats);
    bytesdown:=bytesdown+mystats.dwBytesRcved;
    bytesup:=bytesup+mystats.dwBytesXmited;
 end;
end;
Laden zum Startzeitpunkt:(funktioniert)
Code:
function RasEnumConnections(var lprasconn : PRasConn; var lpcb : DWORD; var lpcconnections : DWORD) : DWORD; stdcall; external 'RasApi32.dll' name 'RasEnumConnectionsA';
function RasGetConnectionStatistics(const hRasConn : DWORD;const lpStatistics : RAS_STATS) : DWORD; stdcall; external 'RasApi32.dll';
Laden zur Laufzeit (erste Funktion): (funktioniert nicht)
Code:
function RasEnumConnections(var lprasconn : PRasConn; var lpcb : DWORD; var lpcconnections : DWORD) : DWORD;
 var REC:TREC;
     Handle:THandle;
 begin
     Handle:=LoadLibrary('RasApi32.dll');
     if handle<>0 then begin
         @REC:= GetProcAddress(Handle,'RasEnumConnectionsA');
         if @REC<>nil then begin
             result:=REC(lprasconn,lpcb,lpcconnections);
         end;
         freeLibrary(Handle);
     end;
 end;
Mein Problem sind nun die Parameter, da diese ja ausgefüllt zurückgegeben werden müßten. Dies geschiet aber nicht!

Wäre super wenn jemand wüßte wie man dies erreichen kann?

Christian Seehase 4. Jun 2003 10:08

Moin MagicShadow,

zum Einen:
Was steht denn nach Ausführung der Funktion in Result?

Zum Anderen:
Hast Du auch daran gedacht dwSize zu füllen?

magicshadow 4. Jun 2003 10:20

Also das result liefert den richtigen Wert (DWORD).
Aber die Parameter die übergeben werden müßten auch werte beinhalten, und da hakts.
Die eigentliche Prozedur funktioniert einwandfrei, wenn ich die API's zum Startzeitpunkt einbinde. Da das Programm dann jedoch weder unter Win NT 4 noch unter 9X/ME funktioniert möchte ich die Api's erst nach einem OS-Check laden, oder eben nicht.

Christian Seehase 4. Jun 2003 10:29

Moin magicshadow,

Zitat:

Zitat von magicshadow
Also das result liefert den richtigen Wert (DWORD)

Dann will ich die Frage mal anders Formulieren:

Welchen Wert denn?

magicshadow 4. Jun 2003 10:42

mhmm, scheint doch nicht ok zu sein, Rückgabewert ist 87 (sollte aber 0 sein, soweit ich weiß)

Christian Seehase 4. Jun 2003 10:47

Moin magicshadow,

also ERROR_INVALID_PARAMETER.

Wie hast Du denn TREC deklariert?

magicshadow 4. Jun 2003 10:49

Des hab ich doch glatt vergessen zu schreiben!

Code:
TREC = function(var lprasconn : PRasConn; var lpcb : DWORD; var lpcconnections : DWORD) : DWORD;

Christian Seehase 4. Jun 2003 10:52

Moin magicshadow,

trag' doch bei der Deklaration mal stdcall nach.

magicshadow 4. Jun 2003 10:58

Ich glaubs nciht, hätt cih eigentlich drauf kommen müßen *g*
Funst. (Das kommt davon wenn man sich zu sehr an Tutorials hält :D )

THX für die Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 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