Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi immer noch Stress mit DLL Aufruf (https://www.delphipraxis.net/37921-immer-noch-stress-mit-dll-aufruf.html)

alf.stefan 13. Jan 2005 07:42

Re: immer noch Stress mit DLL Aufruf
 
Verzweifel, verzweifel
das sind alles gute Ratschläge aber der Durchbruch ist noch nicht geschafft! Könnt ihr vielleicht nochmal
mein überarbeitetes Programm anschauen? Speziell den Teil mit dem AllocMem und dem FreeMem!!

Die Ausgabe ins Memo funktioniert prima aber dann krieg ich immer noch den doofen Fehler 'access violation' nach dem Verlassen der funktion.
Hier die überarbeitete Version
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  c : word;
  getNum, err : KMErrorCode;
  NumDevices : Word;
  erg : string;
  nBuff, ipBuff, SerStrBuff : array of Pchar;
  DipArrayBuff : Array of PUint16;

begin
   KMInitialize;
   Memo1.Lines.Append('Wait....');

   NumDevices :=0;
   KMTCPRefreshDevices();
   getNum := KMTCPGetNumDevices(NumDevices);
   if getNum = 0 then
   begin
     try
        SetLength(nBuff, NumDevices);
        SetLength(ipBuff, NumDevices);
        SetLength(serStrBuff, NumDevices);
        SetLength(DipArrayBuff, NumDevices);

        for c := 0 to NumDevices-1 do
        begin
          nBuff[c] := AllocMem(MAX_TCP_NM_LENGTH);
          ipBuff[c] := AllocMem(MAX_TCP_IP_LENGTH);
          serStrBuff[c] := AllocMem(MAX_TCP_SN_LENGTH);
          new(DipArrayBuff[c]);
        end;

        err := KMTCPGetDeviceInformation(@nBuff[0], @ipBuff[0], @serStrBuff[0], DipArrayBuff[0], NumDevices);
        if err = 0 then
        begin

         memo1.Lines.Append(' Controllers Found '+IntToStr(NumDevices));
         for c:= 0 to NumDevices-1 do
         begin
          Memo1.Lines.Append('Name        : '+nBuff[c]);
          Memo1.Lines.Append('Ip-Addr     : '+ipBuff[c]);
          Memo1.Lines.Append('Serial      : '+serStrBuff[c]);
          Memo1.Lines.Append('Dip Settings : '+IntToStr(DipArrayBuff[c]^));
         end;
        end;//if error
        Memo1.Lines.Append(StringOfChar('-', 60));
     finally
        for c := NumDevices-1 downto 0  do
        begin
          FreeMem(nBuff[c],MAX_TCP_NM_LENGTH);
          FreeMem(ipBuff[c],MAX_TCP_IP_LENGTH);
          FreeMem(serStrBuff[c],MAX_TCP_SN_LENGTH);
          Dispose(DipArrayBuff[c]);
        end;
     end;//try
   end;
end;

alf.stefan 13. Jan 2005 08:15

Re: immer noch Stress mit DLL Aufruf
 
Morgen zusammen

Ich hoffe oder besser ich denke das überarbeitete Programm ist nicht soo schlecht. Mein Problem ist DA nichtmehr.
Ich habe blöderweise in der Deklaration der externen Funktion die dierektive cdecl verwendet und seit ich auf stdCall geändert habe funktioniert Alles aufs Beste.
Allen Beteiligten nochmal vielen Dank


Erleichterter Gruß

Stefan

Christian Seehase 13. Jan 2005 10:36

Re: immer noch Stress mit DLL Aufruf
 
Moin Stefan,

das try gehört allerdings hinter die Schleife, in der Du den Speicher anforderst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Seite 2 von 2     12   

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