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?