Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu StrCopy (https://www.delphipraxis.net/20930-frage-zu-strcopy.html)

Pseudemys Nelsoni 25. Apr 2004 15:01


Frage zu StrCopy
 
hoi,

ich habe eine frage und zwar...

ich habe eine dll geschrieben, dort ist eine variable enthalten die mirc als ergebnis zurückliefert.
Wenn ich nun der variable das ergebnis mit:

Delphi-Quellcode:
StrCopy(data, 'blub');
übergebe funktioniert es.

Aber warum funktioniert das nicht:

Delphi-Quellcode:
data := 'blub';
oder
Delphi-Quellcode:
data := PChar('blub');

?

es steht immer das alte wie zuvor drinne

Assarbad 27. Apr 2004 12:32

Re: Frage zu StrCopy
 
Wäre die Frage was data für ein Typ ist.

Meine Vermutung, die Zuweisung würde den Pointer-Wert verändern, wärend StrCopy eben den String zu der angegebenen Adresse kopiert.

Muetze1 27. Apr 2004 13:02

Re: Frage zu StrCopy
 
Moin!

Dabei geht es wieder um Referenzen in den Strings die so nicht funktionieren ohne die Unterstützung von ShareMem in einer DLL, weil sonst ein String mit Referenz keinen Zugriff auf den Inhalt dessen hat. Wir hatten hier gerade ein Thread dazu: DLL und PChar. Es gibt noch mehr, gut zu finden bei der Suche nach "DLL PChar"...

MfG
Muetze1

Assarbad 27. Apr 2004 13:15

Re: Frage zu StrCopy
 
IMO hat das ausnamhsweise nix mit Sharemem zu tun. Nur bei fremden DLLs zieht die Compilermagic von Delphi (die ein Mischen von PChar und String zuläßt) nicht. Deshalb StrCopy() welches ja bekanntlich nix weiter ist als ein CopyMemory() ;) ... es hat also nicht das Geringste mit dem Delphitypen String zu tun!!!

Pseudemys Nelsoni 27. Apr 2004 13:49

Re: Frage zu StrCopy
 
Moin,

das ganze sah so aus:

Delphi-Quellcode:
function Read(mWnd, aWnd: HWND; data, parms: PChar; show, nopause: boolean): integer; stdcall;
var
  reg: TRegistry;
  s, RegRoot, RegPath, key, OldData: string;
begin
  result := 3;
  OldData := StrPas(data);
  s := StrPas(data);
  if (s = '') or (not (Pos('\', s) > 0)) then
    exit;
  Try
    reg := TRegistry.Create;
    RegRoot := Copy(s, 1, Pos('\', s)-1);
    Delete(s, 1, Pos('\', s));
    RegPath := Copy(s, 1, Pos('\\', s)-1);
    key := s;
    Delete(key, 1, Pos('\\', key)+1);
    Try
      with reg do
      begin
        RootKey := StrToHKEY(RegRoot);
        if OpenKey(RegPath, false) then
        case GetDataType(key) of
          rdString, rdExpandString: StrCopy(data, PChar(ReadString(key)));
          rdInteger: StrCopy(data, PChar(IntToStr(ReadInteger(key))));
        end;
      end;
    except
    end;
    if OldData = StrPas(data) then
      StrCopy(data, '');
  finally
    reg.Free;
  end;
end;
Also "data" ist ein PChar. das mit "pchar" hab ich selbst eingegeben, weil es in C ein Char wäre, siehe hier:

Delphi-Quellcode:
int __stdcall procname(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
aber warum ich "data" nicht einfach was mit ":= 'blub'" zuweisen kann weiss ich immernoch nicht, könntest du das näher erklären? *g*

Muetze1 27. Apr 2004 14:28

Re: Frage zu StrCopy
 
Moin!

Zitat:

Zitat von Assarbad
Nur bei fremden DLLs zieht die Compilermagic von Delphi (die ein Mischen von PChar und String zuläßt) nicht.

Hmm, probiers aus - es klappt auch bei eigenen nicht ohne ShareMem.

Zitat:

Zitat von Assarbad
Deshalb StrCopy() welches ja bekanntlich nix weiter ist als ein CopyMemory()

Er sorgt damit für einen neuen String der einen Referenzzähler von 0 hat und somit seinen eigenen Speicherbereich - und das ist das entscheidende.

Zitat:

Zitat von Assarbad
IMO hat das ausnamhsweise nix mit Sharemem zu tun. ... es hat also nicht das Geringste mit dem Delphitypen String zu tun!!!

Ich habe da meine Erfahrungen und schon öfters in der Richtung debuggt, und daher bezweifle ich das an nach meinem Wissen.

Zitat:

Zitat von Pseudemys Nelsoni
aber warum ich "data" nicht einfach was mit ":= 'blub'" zuweisen kann weiss ich immernoch nicht, könntest du das näher erklären? *g*

Das würde ich dann auch gerne von dir, Assarbad, hören.

MfG
Muetze1

fiasko 27. Apr 2004 14:35

Re: Frage zu StrCopy
 
Hallo,

das ist doch einfach so, wenn du ein StrCopy machst wird das an die Stelle im Speicher geschrieben wo data hinzeigt. Bei der Zuweisung data:= veränderst du den Pointer - das bekommt der Aufrufer aber nicht mit. Wenn du das machen willst mußt du ein Zeiger auf PChar oder sowas übergeben.

[edit]
das würde auch ohne DLL in einem Programm nicht funzen
[/edit]

Muetze1 27. Apr 2004 14:45

Re: Frage zu StrCopy
 
Moin!

Ok, der Fakt ist hier die Ursache, richtig - das hatte ich übersehen. Aber das ändert nix an den Behauptungen von mir.

MfG
Muetze1

Assarbad 27. Apr 2004 15:22

Re: Frage zu StrCopy
 
Zitat:

Zitat von fiasko
das würde auch ohne DLL in einem Programm nicht funzen

Leider doch. Delphi versteckt sehr viel vor dem Programmierer. Wenn du nicht gerade eine sehr abgespeckte System-Unit hast, bekommst du es nicht mit. Schau dir einfach mal die Implementierung von Strings in der System-Unit an.

Zitat:

Zitat von fiasko
das ist doch einfach so, wenn du ein StrCopy machst wird das an die Stelle im Speicher geschrieben wo data hinzeigt.

Hatte ich auch schon erwähnt ;)

Zitat:

Zitat von Muetze1
Er sorgt damit für einen neuen String der einen Referenzzähler von 0 hat und somit seinen eigenen Speicherbereich - und das ist das entscheidende.

Quark, seit wann haben PChars einen Referenzzähler. Bitte schau dir den Prototypen von StrCopy() an und denk nochmal drüber nach. Oder, falls sich das seit Delphi 5 geändert hat, bei mir sind alle Parameter PChars! Und es handelt sich um die Delphi-eigene Funktion.

Zitat:

Zitat von Muetze1
Hmm, probiers aus - es klappt auch bei eigenen nicht ohne ShareMem.

Okay, war redundant -> "bei DLLs" ... DLLs sind immer fremd, es sei denn es sind BPLs!

Zitat:

Zitat von Pseudemys Nelsoni
aber warum ich "data" nicht einfach was mit ":= 'blub'" zuweisen kann weiss ich immernoch nicht, könntest du das näher erklären? *g*

Die Erklärung habe bereits ich schon einmal als Vermutung gebracht und fiasko hat sie ebenfalls nochmal genannt. Es ist eben einmal, daß man einen neuen Pointerwert zuzuweisen versucht und einmal, daß man Speicher an die angegebene Stelle kopiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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