Entwickler-Ecke

Dateizugriff - Probleme mit DLL-Datei


MDX - Do 26.05.11 16:49
Titel: Probleme mit DLL-Datei
Heyho ihr Delphi-Experten (mehr oder weniger ;) ),
ich scheitere hier an einer blöden DLL Datei... Also ich versuch am besten mal die Funktionsweise zu beschreiben:
Ich habe ein Programm (nennen wir es an dieser Stelle einfach mal StringSearch.exe). So dieses Programm hat eine simple Oberfläche welche ein Edit-Feld, einen Hinzufügen-Button, sowie einen "ValueListEditor" (Wenn eventuell jemand eine bessere Idee hat, am besten mitteilen ;) ). Gibt zwar noch andere Sache auf der Oberfläche, aber das ist nicht relevant.
So als nächstes kann man eine Adresse in die Edit-Box eingeben (z.B. http://de.wikipedia.org/wiki/Delphi (Programmiersprache)) und anschließend auf Hinzufügen klicken. Dann wird die Adresse geprüft und die passende Funktion (die in einer .DLL Satei stehen!) geladen werden um den Titel abzufragen, sowie einen bestimmten String im Quelltext zwischen zwei Zeichen.
Nun das eigentliche Problem: Sobald ich die DLL-Funktion in das Hauptprogramm packe, funktioniert alles problemlos. Wenn ich jedoch die Funktionen in eine externe .DLL Datei packe und diese anschließend einbinde erhalte ich eine
Zitat:
Zugriffsverletzung bei Adresse 008E320B in Modul 'wikipedia.dll'. Schreiben von Adresse 004B446C.
Meldung.

So, jetzt frage ich mich natürlich was das Problem ist...? Darum hab ich einfach mal den kompletten Code der DLL eingebunden:

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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
library WikiPedia;


uses
  SysUtils,
  Classes,
  idhttp,
  Windows,
  StrUtils,
  Controls,
  Forms,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient; // Nicht Sicher ob ich das Brauche, ohne erscheint die Meldung jedoch auch...

  type
  TArrayofstring = array of string;

{$R *.res}


function FindInString(Text, SearchFrom, SearchTo: string; FirstOnly: Boolean; var Return: TArrayofstring): Boolean;
var
  i: Cardinal;
  FoundString: string;
begin
  Result := False;
  SetLength(Return, 0);
  i := Pos(SearchFrom, Text);
  while i > 0 do
  begin
    Result := True;
    i := i + Length(SearchFrom);
    FoundString := Copy(Text, i, PosEx(SearchTo,Text,i) - i);
[...]
    if FirstOnly then Break;
  end;
end;

function GetWikipediaID(url:String):String;
var
  p1: integer;
begin
  p1 := Pos('i/',url);
  Result := Copy(url,p1+2,11);
end;

function GetWikipediaTitle(id:string):string;
var
  client : TidHttp;
  s : string;
  p1,p2 : integer;
begin
  client := TidHttp.Create(nil);
  client.AllowCookies := False;
  client.HandleRedirects := True;
  client.Request.UserAgent := 'IE';

  s := client.Get(id);
  client.Free;

  p1 := Pos('<title>',s);
  p2 := Pos('</title>',s);
  Result := Copy(s,p1+7,(p2-p1)-7);
end;

exports
  GetWikipediaID,
  GetWikipediaTitle,
  FindInString;

begin
end.


Ich hoffe dass vielleicht jemand den Fehler findet... Meine Vermutung ist eine inkompatible Komponente bei Uses, aber ich weiß es nicht...

Danke euch

BTW: Bevor jemand fragt wieso ich es nicht in das Hauptprogramm packe ist relativ simpel, das ganze soll mit Modulen dynamisch funktionieren ;)


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 26.05.2011 um 17:20


jaenicke - Do 26.05.11 16:56

Strings als Parameter oder Rückgabewerte sind böse bei DLLs. Manchmal hilft es schon zu lesen was da steht, wenn man ein neues Projekt erstellt...
Erstelle einmal eine neue leere DLL und dann lies was da steht...

Theoretisch kannst du es mit Sharemem notdürftig lösen, aber mach es besser sauber und nimm Typen wie PWideChar, PAnsiChar, ...

// EDIT:
Statt ValueListEditor: Nimm einfach eine TVirtualStringTree. ;-)


MDX - Do 26.05.11 17:49

Danke dir für deine Antwort, man sollte tatsächlich mal den Hinweistext lesen, dann würde es auch funktionieren ;)

Hab mich jetzt für die Variante mit den PWideChars etc. entschieden und funktioniert alles :D

Danke für die schnelle Hilfe und die Erklärung und den Tipp mit den VirtualStringView 8)