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 public 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
g1o2k4 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!