AGB  ·  Datenschutz  ·  Impressum  







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

Pointer aus C++ nach Delphi ???

Offene Frage von "goose33"
Ein Thema von goose33 · begonnen am 7. Sep 2005 · letzter Beitrag vom 7. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#1

Pointer aus C++ nach Delphi ???

  Alt 7. Sep 2005, 01:12
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
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#2

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

  Alt 7. Sep 2005, 01:24
if (DWORD(m_pView) + 4 >= DWORD(m_pNext)) Auf DWORDs bzw. Longwords ist der Operator ">=" anwendbar.
  Mit Zitat antworten Zitat
Benutzerbild von sECuRE
sECuRE

Registriert seit: 10. Apr 2003
Ort: Heidelberg
360 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 7. Sep 2005, 01:24
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
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#4

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

  Alt 7. Sep 2005, 01:27
Zitat von SMO:
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
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#5

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

  Alt 7. Sep 2005, 01:37
....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
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#6

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

  Alt 7. Sep 2005, 01:55
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"...
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#7

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

  Alt 7. Sep 2005, 02:03
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
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#8

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

  Alt 7. Sep 2005, 02:37
Bitte, freut mich dass ich helfen kann.

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

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: 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.
  Mit Zitat antworten Zitat
goose33

Registriert seit: 26. Okt 2004
Ort: Merseburg
49 Beiträge
 
#9

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

  Alt 7. Sep 2005, 03:07
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
Angehängte Dateien
Dateityp: rar library_for_fs_internal_users_849.rar (7,3 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#10

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

  Alt 7. Sep 2005, 11:48
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);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:19 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