![]() |
Stringübergabe in DLL´s
Hallo NG,
nachdem ich nicht mehr weiter weiß wende ich mich vertrauensvoll an euch hehe Ich möchte in einer DLL sehr lange Strings (Texte) bearbeiten. Nun habe ich gelesen, dass eine Stringübergabe an Funktionen in einer DLL nicht sehr geschickt ist, da diese von C - C# nicht verarbeitet werden können (brauchen Nullterminierte Strings). Soweit so gut, bergebe ich halt PChars statt Strings. Das funktioniert auch problemlos bei kleineren Texten, wenn aber nun große Texte übergeben werden, bekomme ich eine Exception. Hat irgendwer eine Idee, wie ich Lange Strings in DLL´s abarbeiten kann? Danke für eure Hilfe |
Moin Christian,
da stellen sich mir doch gleich ein paar Fragen: ;-)
|
Hallo, du hast natürlich vollkommen recht, die Infos sind ein bissl spärlich.
Ich wollte nur mal wissen, ob es problemlos funtioniert deshalb hab ich mir eine Dll gebastelt, die einen Pchar wert bekommt und und den Text spiegelverkehrt wiedergibt. so etwa: function(p:pchar):pchar; begin ... Über Pointer hab ichs probiert aber ich muß gestehen ich habs damit ned zusammengebracht (schäm) mit Pointer bin ich ned so sattelfest leider, weiß zwar im Groben wie ichs zuweis aber bei folgendem funktionsaufruf hat der Debugger immer geschriehen: function(p:Pointer):Pointer; ...[Fehler] Unit1.pas(26): Bezeichner erwartet, aber '(' gefunden Bei pchar funktionierts ganz gut, bei kleinen Textpassagen hatte ich kein Problem. Als ich aber zum Test den Inhalt eines mehrseitigen Worddoc reinkopierte, gabs eine Exception (welche liefere ich nach hab den Source nicht bei mir zum austesten) Ich hab dann mal einfach einen String erstellt indem ich eine schleife bis 50000 durchlaufen lies und zum String jeweils inttostr((i mod 10)) dazugab. Nun hatte ich einen String 50000 Zeichen lang der immer von 1-10 hochzählte. Da hatte ich witzigerweise keine exception. Nun lies ich jedesmal bei 0 zusätzlich in den String #13#10 einfügen und siehe da, ich hatte eine Exception und zwar immer an der selben Stelle etwa 3574te #13#10. Das hat übrigens nichts mit der DLL zu tun, denn nachdem ich die nicht gut debuggen konnte (hab bei Start|Parameter die Exe aufgerufen, die die Dll aufruft, dennoch konnte ich sie nicht debuggen verlangte immer nach Server und parameter oder so) kopierte ich die DLL Funktion einfach in die Exe, der Erfolg war derselbe eine Exception. Hoffe die Beschreibung ist jetzt ein bissl genauer, sodaß ihr damit was anfangen könnt. lg Christian |
Kurz was mir auffält:
du kannst nicht function(p: Pointer):Pointer schreiben. Erstens brauchst du einen Funktionsnamen (z.B. f), zweitens als Pointer ist gemeint, dass du einen Type deklarierst. Z.B. ist PChar = ^String (o.ä.) (Pointer auf String). Ich würde empfehlen, dass du dir ein Tutorial in Turbo Pascal über Pointer ansiehst... Chris Zu Funktionen: Dann schreibst du z.B. function f(p:Pchar): PChar; |
Zitat:
jo hab das mit dem pointer so verstanden hehe ich weiß eh dass es falsch ist und ned geht (heul) wie wäre der richtige aufruf? Naja aber mit pchar müßts ja gehn das ist ja auch nur ein pointer will aber ned :( |
Sorry, die Antwort ist eigentlich schon da... Hab' den Beitrag grad' geändert...
Also, wie gesagt: ein Pointer ist kein eigener Typ. Sondern, eine Art (sozusagen) also wäre ein Regulärer Pointer (ich nehme jetzt mal TP als Beispiel):
Code:
Soähnlich läuft das dann auch unter Delphi (fast kein Unterschied)...
type
meintyp = array[1..10] of string; meinpointer = ^meintyp; Chris |
Hi Chakotay,
ein Pointer ist sehr wohl ein Datentyp... Kompilier mal folgendes:
Code:
Es wird funktionieren...
procedure ShowMsg(p: Pointer);
begin MessageBox(0, PChar(p), 'Test', 48); end; procedure Test; var s: String; begin s := 'Test'; ShowMsg(Pointer(s)); end; MfG, d3g |
Allerdings ist Pointer nicht zu vergleichen mit z.B. ^meintyp, oder?
Chris |
Doch. Ein Typecast von Pointer auf PMeintyp ist ohne weiteres möglich:
Code:
MfG,
type
TMeinTyp = array[1..100] of Integer; PMeinTyp = ^TMeinTyp; procedure ShowValues(p: Pointer); var i: Integer; begin for i := 1 to 100 do ShowMessage(IntToStr(PMeinTyp(p)^[i])); end; procedure Test; var i: Integer; t: TMeinTyp; begin for i := 1 to 100 do t[i] := i; ShowValues(Pointer(@t)); end; procedure TForm1.FormCreate(Sender: TObject); begin Test; end; d3g |
Hier nun die versprochene Exception die ausgelöst wird:
... ist eine Exception der Klasse EAccessVioalation aufetreten... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz