AGB  ·  Datenschutz  ·  Impressum  







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

DLL: Übergabe von Stringwerten ..

Ein Thema von erniepb · begonnen am 11. Jan 2003 · letzter Beitrag vom 14. Jan 2003
Antwort Antwort
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#1

DLL: Übergabe von Stringwerten ..

  Alt 11. Jan 2003, 20:28
Hi .. Also folgendes Problem: ich hab ne Funktion in einer DLL an die ein PChar übergeben wird (wollte halt das mit der ShareMem-unit umgehen) naja wenn ich dann jetzt ein die Funktion aufrufe mit irgendeinem PChar, das aber irgendwo ein ^ enthält .. dann gibts jedes Mal ne Laufzeit-Fehlermeldung das an diversen Speicheradressen nich zugegriffen werden konnte .. liegt das daran dass ^ halt allgemein für Zeiger verwendet wird und PChar letztendlich Zeiger sind ??

Kann mir da vielleicht jemand ne kluge Idee zukommen lassen ?? wär echtr toll .. Danke ERniePB
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 11. Jan 2003, 21:17
Moin Ernie,

das ^ ist nur für den Compiler im Zusammenhang mit Pointern von interesse.

Der Fehler muss von woanders kommen.

Wie ist die Funktion in der DLL deklariert?
Wie wird die Funktion im Programm importiert?
Wie wird die Funktion aufgerufen?
Wie wird die Variable die übergeben wird deklariert?
Wie wird die Variable die übergeben wird initialisiert?

So, ich glaub' das war's im Wesentlichen
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
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#3
  Alt 11. Jan 2003, 21:48
Wie ist die Funktion in der DLL deklariert?

Code:
function Calculate(TransEquation: PChar; Angle : TAngleMode): TMyExtended;
und veröffentlicht mit:
Code:
exports
 Calculate;
Wie wird die Funktion im Programm importiert?

Code:
function Calculate(equation : PChar; Angle : TAngleMode): TMyExtended; external 'CalculationDLL.dll';
Wie wird die Funktion aufgerufen?
Wie wird die Variable die übergeben wird deklariert?
Wie wird die Variable die übergeben wird initialisiert?

Code:
procedure TForm1.Button1Click(Sender: TObject);
 var
  Ergebnis : TMyExtended;
 begin
  Ergebnis := Calculate(PChar(Edit1.Text),RAD);

  If Ergebnis.Defined = True Then
   Edit2.Text := FloatToStr(Ergebnis.Value)
  Else Edit2.Text := 'DNE';
 end;

und TMyExtended ist:
Code:
  TMyExtended = record
                 Defined : Boolean;
                 Value : Extended;
                end;



PS. Aber diese Fehlermeldung kommt immer nur wenn ^ in dem übergebenen PChar enthalten ist .. naja und der Fehler tritt auf bevor überhaupt die erste Zeile der Funktion Calculate bearbeitet wird .. heißt da muss dann ja irgenwie was bei der übergabe falsch laufen oder .. weil wenn ohne ^ dann funktionierts ja .. *seufz*
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 11. Jan 2003, 22:10
Moin Ernie,

also das versteh' ich jetzt allerdings nicht?

Ist nur eine Idee aber versuch mal:

Delphi-Quellcode:
var
  Ergebnis : TMyExtended;
  sWork : string;

begin
  sWork := Edit1.Text;
  Ergebnis := Calculate(@sWork[1],RAD);
  // Wenn das funktioniert
  Ergebnis := Calculate(@Edit1.Text[1],RAD);
  // Ansonsten
  Ergebnis := Calculate(PChar(sWork),RAD);
//...
Und setze auf jeden Fall mal einen Breakpoint auf Ergebnis, und schau Dir mal an, ob hier die Übergabe des Strings funktioniert hat, also sWork auch den ^ enthält.

Was mir gerade noch als Möglichkeit einfällt:

Delphi-Quellcode:
var
  Ergebnis : TMyExtended;
  pWork : PChar;

begin
  pWork := AllocMem(Length(Edit1.Text)+1);
  try
    pWork := @Edit1.Text[1];
    Ergebnis := Calculate(pWork,RAD);
//...
  finally
    FreeMem(pWork,Length(Edit1.Text));
  end;
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
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#5
  Alt 11. Jan 2003, 22:28
Hab mal eben ausprobiert ...

Mit
Code:
Ergebnis := Calculate(@sWork[1],RAD);
kommt es zu nem Stacküberlauf .. aber ohne ^ funktionierts ..

Bei
Code:
Ergebnis := Calculate(@Edit1.Text[1],RAD);
gibts genau das selbe und bei
Code:
Ergebnis := Calculate(PChar(sWork),RAD);
auch

und bei dem letzten sagt er mir auch bei ohne ^ : ungültige Zeigeroperation .. und nu ?????

Noch ne Idee ????????
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Jan 2003, 22:38
Moin Ernie,

ja, einen hab' ich noch

Auf den Aufruf (wie er ganz zu Beginn war) einen Breakpoint setzen, und dann mal mit Ctrl-Alt-C in's CPU Fenster wechseln, um zu sehen, wann er mit dem Fehler kommt.
Hier geht's dann wie üblich mit F7/F8.

Als eine der ersten Aufrufe müsste ein Call auf UniqueString erfolgen, wenn das (mit F8) funktioniert hat bleibt leider erst mal nur der Einzelschritt mit F7.

Erklären kann ich mir das irgendwie nicht so ganz.

Beim letzten Beispiel hab' ich Blödsinn gemacht, sorry

Delphi-Quellcode:
// Statt
  pWork := @Edit1.Text[1];
  // muss
  StrLCopy(pWork,@Edit1.Text[1],Length(Edit1.Text));
  // stehen
Obwohl ich mittlerweile nicht mehr daran glaube, dass da funktioniert..
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
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#7
  Alt 11. Jan 2003, 22:49
ich hab echt gar keine ahnung warum aber .. mit dem letzten funktionierts .. hmm .. kann mir dann da vielleicht einer erklären was das ganze eigentlich wirklich macht ??
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 11. Jan 2003, 22:57
Moin Ernie,

dass die letzte Variante funktioniert freut mich zwar, aber das WARUM kann ich irgendwie nicht so recht beantworten.

Im Prinzip entspricht meine zweite Variante der Deinen, und meine erste und dritte, die's ja nicht taten meiner vierten, die funktioniert

Es wird da ja nichts anderes gemacht, als der Speicher für den String reserviert, und dieser dann mit dem Inhalt von Edit1.Text gefüllt.

Eine Idee, was die Ursache sein könnte hätte ich noch.

Falls Du den Mut hast das noch mal zu probieren:

Statt

Delphi-Quellcode:
  sWork := Edit1.Text;
  Ergebnis := Calculate(@sWork[1],RAD);
probier mal bitte

Delphi-Quellcode:
  sWork := Edit1.Text+#00;
  Ergebnis := Calculate(@sWork[1],RAD);
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
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#9
  Alt 14. Jan 2003, 20:12
DANKE Christian .. hab das letzte jetzt auch nochmal ausprobiert .. und das geht auch .. aber frag mich bitte bitte nicht warum das vorher nich so geklappt hat .. hab nich die geringste Ahnung .. egal !! nochmal ganz doll viel Danke !!!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:03 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