Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer aus C++ nach Delphi ??? (https://www.delphipraxis.net/52938-pointer-aus-c-nach-delphi.html)

goose33 7. Sep 2005 00:12


Pointer aus C++ nach Delphi ???
 
Hallo,

folgendes Problem :

Ich hab ne C++ datei und muss die nach Delphi convertieren.
Nun arbeiten die ja sehr viel mit Zeigern.
Ich hab also einen Zeiger definiert :

Code:
  m_pView           : pointer;
  m_pNext           : pointer;
nun steht in dem C++ code irgendwo sowas :

Code:
if ((m_pView + 4) >= m_pNext)
Nun die Frage wie ich das machen muss ?

Ich hab folgendes probiert :

Code:
if ((m_pView + 4) >= m_pNext) then // geht nich
if (DWORD(m_pView + 4) >= m_pNext) then // geht auch nicht
if (Pointer(DWORD(m_pView) + 4) >= m_pNext) then // das geht aber auch nicht

Ich hab keine Ahnung wie ich das machen muss.

Kann mir mal jemand weiterhelfen ?

Danke
matthias

ps:
Das hier :

Code:
if (Pointer(DWORD(m_pView) + 4) >= Pointer(DWORD(m_pNext)))
geht auch nicht und die Fehlermeldung von Delphi lautet :

'Operator ist auf diesen Operandentyp nicht anwendbar'

noch zur Info

SMO 7. Sep 2005 00:24

Re: Pointer aus C++ nach Delphi ???
 
Delphi-Quellcode:
if (DWORD(m_pView) + 4 >= DWORD(m_pNext))
Auf DWORDs bzw. Longwords ist der Operator ">=" anwendbar. ;)

sECuRE 7. Sep 2005 00:24

Re: Pointer aus C++ nach Delphi ???
 
Hi,

also ich würde mich vom Pointerkonzept lösen, solange du es nicht aus Kompatiblitätsgründen beim Austausch von 2 Anwendungen brauchst. In Delphi gibt's für Listen (ist doch das, was du machen möchtest, oder?) TList, such einfach mal in der Hilfe danach.

cu

goose33 7. Sep 2005 00:27

Re: Pointer aus C++ nach Delphi ???
 
Zitat:

Zitat von SMO
Delphi-Quellcode:
if (DWORD(m_pView) + 4 >= DWORD(m_pNext))
Auf DWORDs bzw. Longwords ist der Operator ">=" anwendbar. ;)

Hallöchen,

geht ja wiedermal echt schnell !!! Danke, das funktioniert !

Ich würd da ja auch was anderes nehmen, aber ich muss die blöde C++ Datei
irgendwie in Delphi nutzen.
Bin schon froh das ich damit so weit gekommen bin.
Vielleicht kommen noch einige Fragen....wenn Ihr dann nochmal helfen könntet ?

DANKE EUCH
Matthias

goose33 7. Sep 2005 00:37

Re: Pointer aus C++ nach Delphi ???
 
....und schon haben wir den Salat :-)

Code:
   // send the request
   __asm
   {      push eax
         call next
      next: pop eax
         mov dwError,eax
         pop eax
   }
   *((DWORD *) m_pView) = dwError; // DWORD
Delphi meckert hier schon bei dem call next .

Jetzt weiss ich aber wirklich nix mehr.

Ihr vielleicht ?

Dank Euch
Matthias

SMO 7. Sep 2005 00:55

Re: Pointer aus C++ nach Delphi ???
 
Labels (Sprungmarken) in einem asm-Block müssen in Delphi mit @ beginnen, also so:
Delphi-Quellcode:
asm
  push eax
  call @next
@next:
  pop eax
  mov dwError,eax
  pop eax
end;
Der Code kommt mir allerdings seltsam vor. Wieso "call @next" wenn die Anweisungen unter @next sowieso ausgeführt werden würden... und wo ist das zugehörige "ret"...

goose33 7. Sep 2005 01:03

Re: Pointer aus C++ nach Delphi ???
 
Hallo,

erst mal GANZ GROSSEN DANK,
habs grad probiert und nix mit meckern....geht !

Aber zu Deinen Fragen kann ich Dicr echt nix sagen.
Ich hab ja nich mal ne Ahnung woher Ihr immer sowas wissen könnt ?

Noch was :

Code:
DWORD(m_pView) := dwError;
Das is die letzte Zeile unten.
Ich glaub zwar das das so richtig ist aber die beiden * in dem
C++ machen mich ein bischen Stutzig.
Stimmt das denn so ?

DANKE
Matthias

SMO 7. Sep 2005 01:37

Re: Pointer aus C++ nach Delphi ???
 
Bitte, freut mich dass ich helfen kann. :)

Was der asm-Code macht, sehe ich jetzt auch (die Speicheradresse von @next nach dwError schreiben).

Zitat:

Zitat von goose33
Noch was :

Code:
DWORD(m_pView) := dwError;
Das is die letzte Zeile unten.
Ich glaub zwar das das so richtig ist aber die beiden * in dem
C++ machen mich ein bischen Stutzig.
Stimmt das denn so ?

Nicht ganz. Das würde den Wert von dwError in die Pointervariable m_pView kopieren. Der Wert soll jedoch an die Speicheradresse kopiert werden, auf die m_pView zeigt:

"(DWORD *) m_pView" entspricht einem Typecast, die Variable m_pView wird nun als Pointer auf ein DWORD angesehen. In Delphi wäre das "PDWORD(m_pView)".

"*(...)" dereferenziert diesen Pointer, damit spricht man das Ziel an, auf das gezeigt wird, und nicht die Pointervariable selbst. In Delphi entspricht das einem angehängten "^".

Komplett also:
Delphi-Quellcode:
PDWORD(m_pView)^ := dwError;
Wenn m_pView direkt als PDWORD deklariert wäre (m_pView: PDWORD statt m_pView: Pointer), dann könnte man sich den Typecast sparen (m_pView^ := dwError). Je nachdem wie m_pView im restlichen Code benutzt wird, wäre das sinnvoll.

Und sECuRE hat natürlich Recht, wäre besser wenn du den C-Stil nicht 1:1 nach Delphi übersetzt, sondern gleich "ordentlichen" Delphicode daraus machst. Aber das macht noch mehr Arbeit.

goose33 7. Sep 2005 02:07

Re: Pointer aus C++ nach Delphi ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöchen,

so richtig hab ich das bis jetzt noch nicht kapiert, aber ich glaube das ich da noch mehr solcher fehler drin hab und das ganze deswegen nicht so richtig funktioniert.

In "richtigem" Delphi würd ich das ja gerne schreiben , aber ich bin froh wenn ich das irgendwann so hinbekomme.
dafür fehlt mir einfach das wissen einerseits noch in Delphi, denn das mach ich noch nicht so sehr lange und zum anderen natürlich in C++. Damit hab ich ja noch nie was gemacht.
Vieles in C++ is mir absolut schleierhaft :-) und da bin ich froh wenn ich das überhaupt hinbekomme.

Du sagtest das Du nicht weisst wie mit der Variablen weiterverfahren wird. Ich hab Dir deswegen mal den completten C++ code drangehangen. Wenn Du willst kannst Du ja mal reinschauen.

Hier hab ich mal noch sein einige dinge wo ich nicht so genau weiss ob ich das richtig gemacht habe.
Vielleicht kannste das ja nochmal durchschauen ?
Das wär echt super von Dir / Euch !!

Links is immer das C++ dann ein -> und dahinter das was ich draus gemacht habe.

Code:
dwError = SendMessage(m_hWnd, WM_IPCTHREADACCESS, (WPARAM) (m_pNext - m_pView - 4), (LPARAM) m_pView); ->  dwError := SendMessage(m_hWnd, WM_IPCTHREADACCESS, (DWORD(m_pNext) - DWORD(m_pView) - 4), DWORD(m_pView));

m_pNext = m_pView + 4; -> m_pNext := POINTER(DWORD(m_pView) + 4);

pdw = (DWORD *) (m_pView + 4); // ?? da bin ich noch am rätseln ...
Vielleicht kannste Dir das nochmal anschauen ?

Danke
Matthias

SMO 7. Sep 2005 10:48

Re: Pointer aus C++ nach Delphi ???
 
Zitat:

Zitat von goose33
Du sagtest das Du nicht weisst wie mit der Variablen weiterverfahren wird. Ich hab Dir deswegen mal den completten C++ code drangehangen. Wenn Du willst kannst Du ja mal reinschauen.

Danke, aber dafür habe ich im Moment leider keine Zeit.

Zitat:

Code:
dwError = SendMessage(m_hWnd, WM_IPCTHREADACCESS, (WPARAM) (m_pNext - m_pView - 4), (LPARAM) m_pView); ->  dwError := SendMessage(m_hWnd, WM_IPCTHREADACCESS, (DWORD(m_pNext) - DWORD(m_pView) - 4), DWORD(m_pView));

m_pNext = m_pView + 4; -> m_pNext := POINTER(DWORD(m_pView) + 4);

pdw = (DWORD *) (m_pView + 4); // ?? da bin ich noch am rätseln ...

Scheint soweit OK. Wie ich in meinem letzten Beitrag bereits erklärt habe, ist (DWORD *) ein Typecast. In Delphi geht das so:
Delphi-Quellcode:
var pdw: PDWORD;
//...
pdw := PDWORD(DWORD(m_pView) + 4);


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.
Seite 1 von 2  1 2      

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