Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fehlerhafte String auswertung (https://www.delphipraxis.net/208299-fehlerhafte-string-auswertung.html)

venice2 11. Jul 2021 18:11


Fehlerhafte String auswertung
 
Delphi-Quellcode:
type
  PSOP64 = ^TSOP64;
  TSOP64 = record
    plugin: array[0..MAX_PATH] of AnsiChar;
  end;
Delphi-Quellcode:
var
  gCDS: COPYDATASTRUCT;
  gSOP: TSOP64;
Delphi-Quellcode:
procedure SOP_SetPlugin(Plugin: PWideChar);
begin
  if (gp.hSOPlugin <> 0) then
  begin
    FillChar(gSOP.plugin, 0, MAX_PATH);
    WideCharToMultiByte(CP_ACP, 0, Plugin, -1, gSOP.plugin, MAX_PATH, nil, nil);
    gCDS.dwData := 2;
    gCDS.cbData := SizeOf(gSOP);
    gCDS.lpData := @gSOP;
    SendMessage(gp.hSOPlugin, WM_COPYDATA, WPARAM(gP.MainHandle), LPARAM(@gCDS));
  end;
end;
gSOP.plugin ist als AnsiChar definiert und wird korrekt gefüllt.
Nach dem senden der Message ist aber in der anderen Exe der String Fehlerhaft.

Jemand eine Idee woran es liegt?
Beide Records sind gleich.

Hier sind die Daten falsch.
Delphi-Quellcode:
pSOP := @pCDS.lpData;
if (InitVisDll(pSOP.plugin)) then // <<<<< pSOP.plugin ist nicht der gleiche String
EDIT:
Ok.. Hat sich erledigt. Sorry

Die Lösung!
Delphi-Quellcode:
pSOP := @pCDS.lpData;

@ ist nicht gleich Pointer

So geht's.
Delphi-Quellcode:
pSOP := Pointer(pCDS.lpData);

Amateurprofi 12. Jul 2021 12:14

AW: Fehlerhafte String auswertung
 
Wenn "plugin" als
Delphi-Quellcode:
array[0..MAX_PATH] of AnsiChar;
definiert ist
müsste es m.E. mit
Delphi-Quellcode:
FillChar(gSOP.plugin, 0, MAX_PATH+1);
gelöscht werden, weil sonst der letzte AnsiChar nicht gelöscht wird.

venice2 12. Jul 2021 12:17

AW: Fehlerhafte String auswertung
 
Zitat:

Zitat von Amateurprofi (Beitrag 1492196)
Wenn "plugin" als
Delphi-Quellcode:
array[0..MAX_PATH] of AnsiChar;
definiert ist
müsste es m.E. mit
Delphi-Quellcode:
FillChar(gSOP.plugin, 0, MAX_PATH+1);
gelöscht werden, weil sonst der letzte AnsiChar nicht gelöscht wird.

Danke werde es mal mit reinpacken. ;)

himitsu 12. Jul 2021 12:26

AW: Fehlerhafte String auswertung
 
Zitat:

Zitat von venice2 (Beitrag 1492181)
Die Lösung!
Delphi-Quellcode:
pSOP := @pCDS.lpData;

@ ist nicht gleich Pointer

So geht's.
Delphi-Quellcode:
pSOP := Pointer(pCDS.lpData);



Doch, Beide sind Pointer.
* ein Zeiger auf die Variable (was du nicht wolltes)
* ein Zeiger, auf den die Variable zeigt (was du wolltest)



Aber sicher, dass die Definition stimmt?
Zitat:

Delphi-Quellcode:
array[0..MAX_PATH] of AnsiChar;

Wenn es MAX_PATH groß sein soll, dann
Delphi-Quellcode:
array[0..MAX_PATH-1] of AnsiChar;

oder
Delphi-Quellcode:
array[1..MAX_PATH] of AnsiChar;

venice2 12. Jul 2021 12:33

AW: Fehlerhafte String auswertung
 
Zitat:

Doch, Beide sind Pointer.
* ein Zeiger auf die Variable (was du nicht wolltes)
* ein Zeiger, auf den die Variable zeigt (was du wolltest)
Danke Super Erklärung wie immer und 32Bit.dll's Plugins laufen mit meiner 64Bit Anwendung.
Werde mir den Unterschied merken.


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