Autor Beitrag
1aa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: Fr 09.05.08 09:19 
Ich rufe in meinem Programm eine DLL auf:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.