AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Programm stürzt bei Zugriff auf DLL ab

Ein Thema von WorstNightmare · begonnen am 6. Okt 2008 · letzter Beitrag vom 7. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2   
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#1

Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 13:37
Hi,

ich habe eine DLL geschrieben, die mir einfachen Zugriff auf die Grundfunktionen von RegExpr.pas gibt, da ich noch viele andere Libraries habe, die Reguläre Ausdrücke verwenden, und diese nicht wegen RegExpr.pas 100 KB größer werden sollen.
Bei mir funktioniert die DLL auch (Vista Ultimate SP1), nur bei einem Kollegen (Windows XP SP3) stürzt das Programm, welches auf die DLL zugreift, ab.

Dies ist der Code in der DLL:
Delphi-Quellcode:
library RegExp;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }


uses
  RegExpr;

{$R *.res}

function RegEx(Mask, Source: PChar): PChar; stdcall;
var
  RE: TRegExpr;
begin
  RE := TRegExpr.Create;
  RE.Expression := Mask;
  try
    if RE.Exec(Source) then
      Result := PChar(RE.Match[0])
    else
      Result := 'kein Treffer';
  finally
    RE.Free;
  end;
end;

exports
  RegEx;

begin
end.
Und so sieht die Zugriffs-Unit aus:
Delphi-Quellcode:
unit RegExp;

interface

const
  LIB = 'Plugins\RegExp.dll';
  NOT_MATCHED = 'kein Treffer';

function RegExProc(Mask, Source: PChar): PChar; stdcall; external LIB name 'RegEx';
function RegEx(Mask, Source: string): string;

implementation

function RegEx(Mask, Source: string): string;
begin
  Result := RegExProc(PChar(Mask), PChar(Source));
end;

end.
Ein Aufruf sieht z.B. so aus:
Delphi-Quellcode:
var
  s: string;
begin
  s := RegEx('\d+', 'asd123dsa');
end;
Beides wurde mit Delphi 2009 kompiliert.
Liegt der Fehler in meinem Code, oder kann es auch an etwas anderem liegen?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 13:39
PChar(RE.Match[0]) ist nach verlassen der DLL-Funktion nicht mehr gültig. Du gibst es ja mit RE.Free den Speicher frei.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 13:49
Am einfachsten wäre es wohl, von PChar auf Widestring umzustellen. Der Speicher von Widestrings wird nämlich von einer Windows-DLL verwaltet, also sollte es keine Probleme geben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#4

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 14:02
Ich habe es jetzt so abgeändert:
Delphi-Quellcode:
function RegEx(Mask, Source: PChar): PChar; stdcall;
var
  RE: TRegExpr;
  M: string;
begin
  RE := TRegExpr.Create;
  RE.Expression := Mask;
  try
    if RE.Exec(Source) then
    begin
      M := RE.Match[0];
      Result := PChar(M)
    end
    else
      Result := 'kein Treffer';
  finally
    RE.Free;
  end;
end;
Das Problem mit dem ungültigen PChar wäre somit doch gelöst, oder?
Der Fehler tritt bei meinem Kollegen jedoch immer noch auf
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 14:04
Beim verlassen der Routine wird bei allen referenzierten Strings der Referenzzähler dekrementiert. Somit ist der zurückgegebene String immer noch ungültig.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#6

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 15:07
Hm, mir ist gerade auch eingefallen, dass es eigentlich noch nicht einmal daran liegt. Das Programm stürzt direkt beim Eintritt in die Routine ab (ich weiß nicht ob es überhaupt soweit kommt).

Woran kann das nur liegen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 15:19
Du übergibst da mit deinen PChar Zeiger auf Speicherbereiche, aber ist der dahinter liegende Speicher überhaupt reserviert oder greift die DLL ins Leere? Siehe dazu auch hier: Rückgabe von Strings aus DLLs
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
gispos

Registriert seit: 20. Dez 2007
Ort: germany, stuttgart
12 Beiträge
 
#8

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 17:48
Versuchs mal so:
Delphi-Quellcode:
function RegEx(Mask, Source: PChar; out P : PChar): Integer; stdcall;
var
  RE: TRegExpr;
  A: AnsiString;
begin
  Result:= 0;
  RE := TRegExpr.Create;
  RE.Expression := Mask;

  try
    if RE.Exec(Source) then
      A := RE.Match[0]
    else
      A := 'kein Treffer';

    GetMem(P, Length(A) + 1);
    Result:= Length(A) + 1;
    MoveMemory(P, @A[1], Result);
  finally
    RE.Free;
  end;

end;

exports
  RegEx;

begin
end.
Aufruf
Delphi-Quellcode:
var
  P: PChar;
  I: Integer;
begin
   I:= 0;
  I:= RegEx('\d+', 'asd123dsa', P);
  If I > 0 then
  begin
    Caption:= P;
    FreeMem(P, I);
  end;
end;
Gruß gispos
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 17:52
Du gibst mit einem Speichermanager frei, was du mit dem anderen allozierst. Das kann nicht funktionieren. Du müsstest eine weitere Funktion FreeString exportieren, in der du den PChar dann freigibst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
gispos

Registriert seit: 20. Dez 2007
Ort: germany, stuttgart
12 Beiträge
 
#10

Re: Programm stürzt bei Zugriff auf DLL ab

  Alt 6. Okt 2008, 18:07
Zitat von Apollonius:
Du gibst mit einem Speichermanager frei, was du mit dem anderen allozierst.
Hmm… ich denke der Speicherbereich liegt auf der aufrufenden Anwendung, und kann auch von dieser frei gegeben werden. P ist als out deklariert.
Oder sehe ich da etwas falsch, bei mir laufen diese Routinen ohne Probleme. Könntest Du das genauer Erklären?

Gruß gispos
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 Uhr.
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