AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringübergabe in DLL´s

Ein Thema von Christian Kaufmann · begonnen am 29. Aug 2002 · letzter Beitrag vom 30. Aug 2002
Antwort Antwort
Seite 1 von 2  1 2      
Christian Kaufmann

Registriert seit: 5. Aug 2002
7 Beiträge
 
#1

Stringübergabe in DLL´s

  Alt 29. Aug 2002, 17:10
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 29. Aug 2002, 18:23
Moin Christian,

da stellen sich mir doch gleich ein paar Fragen:
  • Was verstehst Du unter "lang"?
  • Welche Exception wird ausgelöst?
  • Hast Du mal geprüft, an welcher Stelle genau der Fehler auftritt? (z.B. immer an der gleichen Stringposition bei der Verarbeitung, sofort, wenn die Funktion in der DLL angeprochen wird)
  • Wie übergibst Du den String? (Funktionsdeklaration)
  • Hast Du mal probiert statt eines PChar einen Pointer zu übergeben, mit anschliessendem TypeCast auf PChar in der Funktion?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Kaufmann

Registriert seit: 5. Aug 2002
7 Beiträge
 
#3
  Alt 29. Aug 2002, 19:22
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(pointer)ointer;
...[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
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 29. Aug 2002, 20:05
Kurz was mir auffält:
du kannst nicht function(p: Pointer)ointer 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(pchar): PChar;
  Mit Zitat antworten Zitat
Christian Kaufmann

Registriert seit: 5. Aug 2002
7 Beiträge
 
#5
  Alt 29. Aug 2002, 20:07
Zitat von Chakotay1308:
Kurz was mir auffält:
du kannst nicht function(p: Pointer)ointer schreiben. Erstens brauchst du einen Funktionsnamen (z.B. f), zweitens was ist Pointer? Hast du den Type selbst deklariert und hast du das mit Pointer... so verstanden?

Chris
das ich einen funktionsnamen brauch ist eh klar hab ich in der eile jetzt mal weggelassen weils eh wurscht ist wie die heißt.
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
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 29. Aug 2002, 20:10
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:
type
  meintyp = array[1..10] of string;
  meinpointer = ^meintyp;
Soähnlich läuft das dann auch unter Delphi (fast kein Unterschied)...

Chris
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#7
  Alt 29. Aug 2002, 20:26
Hi Chakotay,

ein Pointer ist sehr wohl ein Datentyp... Kompilier mal folgendes:

Code:
procedure ShowMsg(p: Pointer);
begin
  MessageBox(0, PChar(p), 'Test', 48);
end;

procedure Test;
var
  s: String;
begin
  s := 'Test';
  ShowMsg(Pointer(s));
end;
Es wird funktionieren...

MfG,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 29. Aug 2002, 20:41
Allerdings ist Pointer nicht zu vergleichen mit z.B. ^meintyp, oder?

Chris
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#9
  Alt 29. Aug 2002, 21:18
Doch. Ein Typecast von Pointer auf PMeintyp ist ohne weiteres möglich:
Code:
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;
MfG,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Christian Kaufmann

Registriert seit: 5. Aug 2002
7 Beiträge
 
#10
  Alt 30. Aug 2002, 01:46
Hier nun die versprochene Exception die ausgelöst wird:

... ist eine Exception der Klasse EAccessVioalation aufetreten...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:41 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