AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu StrCopy

Ein Thema von Pseudemys Nelsoni · begonnen am 25. Apr 2004 · letzter Beitrag vom 27. Apr 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Frage zu StrCopy

  Alt 25. Apr 2004, 15:01
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:

StrCopy(data, 'blub'); übergebe funktioniert es.

Aber warum funktioniert das nicht:

data := 'blub'; oder data := PChar('blub');
?

es steht immer das alte wie zuvor drinne
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#2

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 12:32
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 13:02
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
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#4

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 13:15
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!!!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 13:49
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:

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*
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 14:28
Moin!

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 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 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 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
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#7

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 14:35
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]
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 14:45
Moin!

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

MfG
Muetze1
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#9

Re: Frage zu StrCopy

  Alt 27. Apr 2004, 15:22
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 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 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 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 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.
  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 18: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