Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Fehler beim Benutzen von DLL Procedure (https://www.delphipraxis.net/115998-fehler-beim-benutzen-von-dll-procedure.html)

Lucifer 21. Jun 2008 13:16


Fehler beim Benutzen von DLL Procedure
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo.



Ich habe ein Problem wenn ich eine Procedure benutze welche ich in einer DLL eingetragen habe.
Wenn ich die Procedure in der Unit des Programms deklariere und definiere dann funktioniert alles problemlos.

Wenn ich sie aber über eine DLL benutze bekomme ich eine Fehlermeldung.

das ist die DLL

Delphi-Quellcode:
library map;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Grids,
  StdCtrls,
  Classes;

{$R *.res}

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f:         TextFile;
  iTmp, i, k: Integer;
  strTemp:   String;
begin
  AssignFile(f, FileName);
  Reset(f);
  with StringGrid do
  begin
    // Get number of columns
    Readln(f, iTmp);
    ColCount := iTmp;
    // Get number of rows
    Readln(f, iTmp);
    RowCount := iTmp;
    // loop through cells & fill in values
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
      begin
        Readln(f, strTemp);
        Cells[i, k] := strTemp;
      end;
  end;
  CloseFile(f);
end;


exports
  LoadStringGrid;

begin

end.
und ich benutz sie so:

Delphi-Quellcode:

...

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
external 'map.dll'

...

LoadStringGrid(frmMapMv.sgMap, land+'.mp');
in land steht nur welche datei geladen werden muss.

Die Fehlermeldung ist
Zitat:

Invalid Pointer Operation
Im Attachment liegen Bilder zu den Errors

Jakob Ullmann 21. Jun 2008 13:38

Re: Fehler beim Benutzen von DLL Procedure
 
Setze mal statt

Delphi-Quellcode:
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
->

Delphi-Quellcode:
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName); stdcall;
und

Delphi-Quellcode:
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName); external 'map.dll'
->

Delphi-Quellcode:
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName); stdcall; external 'map.dll';

Die Muhkuh 21. Jun 2008 13:38

Re: Fehler beim Benutzen von DLL Procedure
 
Ein Problem dürfte auch sein, dass TFileName ein String ist. Siehe dazu den Kommentar in der DLL

DeddyH 21. Jun 2008 13:58

Re: Fehler beim Benutzen von DLL Procedure
 
Ich verstehe nicht, wieso den Kommentar nie jemand liest, schließlich schreibt Borland/CodeGear/Dingsdatorero den ja nicht umsonst rein *koppschüttel*.

Die Muhkuh 21. Jun 2008 14:00

Re: Fehler beim Benutzen von DLL Procedure
 
Vielleicht wusste der TE nicht, dass TFileName im Endeffekt ein String ist.

Lucifer 21. Jun 2008 14:04

Re: Fehler beim Benutzen von DLL Procedure
 
Die erste Variante mit stdcall hatt nicht geklappt

Dann zur ShareMem:

Wenn ich sie benutze dann kann ich zwar die Dateien laden, aber es kommt dauern nach beenden des Programms
Zitat:

Runtime Error 217 at 00413CB8

Wie ich dass dann mit TFileName ändern kann weis ich nicht.

Die Muhkuh 21. Jun 2008 14:05

Re: Fehler beim Benutzen von DLL Procedure
 
Verwende PChars anstatt Strings

DeddyH 21. Jun 2008 14:07

Re: Fehler beim Benutzen von DLL Procedure
 
Zitat:

To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters.
Das steht da oben.

hoika 21. Jun 2008 14:13

Re: Fehler beim Benutzen von DLL Procedure
 
Hallo,

hast du denn nun ShareMem als erstes in Dll UND Programm eingebunden ?

Cells[] eines StringGrids ist ja auch vom Typ String


Heiko

mirage228 21. Jun 2008 14:14

Re: Fehler beim Benutzen von DLL Procedure
 
Alternativ auch Delphi-Referenz durchsuchenWideString. Damit hast du -quasi- die selbe Funktionalität wie bei strings ohne die Einschränkung mit ShareMem u.dgl. :)

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
Seite 1 von 2  1 2      

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