Autor Beitrag
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Do 26.05.11 16:49 
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. 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:
ausblenden volle Höhe 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


Zuletzt bearbeitet von MDX am Do 26.05.11 17:51, insgesamt 2-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

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

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: 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)