![]() |
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:
übergebe funktioniert es.
StrCopy(data, 'blub');
Aber warum funktioniert das nicht:
Delphi-Quellcode:
oder
data := 'blub';
Delphi-Quellcode:
data := PChar('blub');
? es steht immer das alte wie zuvor drinne |
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. |
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: ![]() MfG Muetze1 |
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!!!
|
Re: Frage zu StrCopy
Moin,
das ganze sah so aus:
Delphi-Quellcode:
Also "data" ist ein PChar. das mit "pchar" hab ich selbst eingegeben, weil es in C ein Char wäre, siehe hier:
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;
Delphi-Quellcode:
aber warum ich "data" nicht einfach was mit ":= 'blub'" zuweisen kann weiss ich immernoch nicht, könntest du das näher erklären? *g*
int __stdcall procname(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
|
Re: Frage zu StrCopy
Moin!
Zitat:
Zitat:
Zitat:
Zitat:
MfG Muetze1 |
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] |
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 |
Re: Frage zu StrCopy
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz