Entwickler-Ecke

Dateizugriff - Probleme mit Dll zugriffen


1aa - Fr 09.05.08 09:19
Titel: Probleme mit Dll zugriffen
Ich rufe in meinem Programm eine DLL auf:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
interface

uses ShareMem,Classes;

     procedure BDaten_Speichern;
     procedure BDaten_Laden;
     procedure BDaten_Unter(var Temp:TStringlist;zahl:integer);

  procedure VerschlZeile(var s:string; n:integer); external 'Data\bin\bv.dll';

implementation


Das Programm läuft auch ohne Probleme bis ich es Beenden will. Dann Stürzt es nämlich mit der Fehlermeldung ab.

Fehlermeldung:

Im Projekt Projekt1.exe iste eine Exception der Klasse EInvalidPointer aufgetreten. Meldung: 'Ungültige Zeigeroperation'. Prozess wurde angehalten...


Andreas Schilling - Fr 09.05.08 13:10

Den gleichen Fehler hatte ich auch. Das Problem ist das Arbeiten mit Stringvariablen. Ist die DLL von die dann ändere in der dll den Typ auf shortstring und im Procedureaufruf auch. Bei einer anderen DLL mit PChar versuchen im Procedureaufruf.


jaenicke - Fr 09.05.08 13:19

Hast du ShareMem vielleicht in einer Unit eingebunden? Wenn ja: Du musst es im Projektquelltext als erstes tun, nicht in irgendeiner Unit, und das gleiche gilt für die DLL, dort muss es auch im Projektquelltext selbst als erstes in der uses stehen.

Besser für DLLs sind allerdings (die hier ja bereits angesprochenen) PChars, da nur dann eine DLL auch aus anderen Sprachen als Delphi angesprochen werden kann. Dann kannst du dir auch ShareMem und die Mitlieferung der entsprechenden DLL sparen.


g1o2k4 - Fr 09.05.08 20:36

ich glaube es fehlt die art des aufrufs. kp ob das das problem behebt. ich machs immer so.

bsp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  function addiere(x, y: extended): extended; stdcall;

implementation

{$R *.dfm}

function addiere(x, y: extended): extended; stdcall;
external 'Library1.dll';


und die entsprechende dll sieht dann so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
library Library1;  

uses
  SysUtils,
  Classes;

{$R *.res}

function addiere(x, y: extended): extended; stdcall;
begin
  result := x + y;
end;

exports
  addiere;

begin
end.



probiers mal mit angabe der art des aufrufs hinter dem rückgabetyp.


Delete - Fr 09.05.08 21:08

user profile icong1o2k4 hat folgendes geschrieben:
ich glaube es fehlt die art des aufrufs und die deklaration muss glaub ich in den implementationsteil ich machs jedenfalls immer so:

Wenn nichts angegeben ist, nimmt Delphi automatisch Register.