Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit C++ Pointern (https://www.delphipraxis.net/144955-problem-mit-c-pointern.html)

GOOFY009 20. Dez 2009 17:07


Problem mit C++ Pointern
 
Hallo !

Ich habe mal wieder ein Problem mit der Portierung von C++ Code nach Delphi.... Denke ich zumind., da das Programm nicht die richtigen Ergebnisse zu liefern scheint.

Hier mal die C++ Deklarationen und Funktionen :
Delphi-Quellcode:
    DWORD read = 0;
    LPBYTE buffer = new BYTE[end-start];
    DWORD_PTR ptr;
    int *value;
    int *cmp;
    int k, add, tmp;
    int pattern;

    if (!buffer)
   return;
   pattern = 0xFE27C0;
   if(ReadProcessMemory(procHandle, (void*)start, buffer, end - start, &read) == NULL)
        return;
    else
    { 
      if (start+2*sizeof(value) >= end)
         return;
      for(add = 0; add < (int)(end - start - 2*sizeof(value)); ++add)
      { 
         value = (int*)&buffer[add];
         cmp = (int*)&buffer[add+4];
         if (*value == pattern && *cmp == 0)


......
Und hier mal meine bisheriger Delphi Code:
Delphi-Quellcode:
var
  read         : DWORD;
  buffer       : Array of PByte;
  ptr          : Longint;
  value, cmp   : ^Integer;
  k, add, tmp  : Integer;
  pattern      : Integer;
begin
  read := 0;
  SetLength(buffer,(ends-start));
  if (Length(buffer) = 0) then exit;
  pattern := $FE27C0;
  if not(ReadProcessMemory(m_ProgHandle, Pointer(start), buffer, ends - start, read)) then
       exit
    else begin
        if (start + (2 *sizeof(value)) >= ends) then
       exit;
        for add := 0 to Integer(ends - start - (2*sizeof(value)))-1 do begin
       value := @buffer[add];
       cmp  := @buffer[add+4];
            if (value^ = pattern) and (cmp^ = 0) then begin


........
Eventuell habe ich ja mit den Pointern einen Fehler gemacht.. ?!
Bin für jede Hilfe dankbar!

CU
GOOFY

SirThornberry 20. Dez 2009 17:16

Re: Problem mit C++ Pointern
 
"Array of Type" ist etwas Delphieigenes. Dahinter steckt eine Längeninformation etc.

GOOFY009 20. Dez 2009 17:52

Re: Problem mit C++ Pointern
 
Zitat:

Zitat von SirThornberry
"Array of Type" ist etwas Delphieigenes. Dahinter steckt eine Längeninformation etc.

Sorry... aber was soll mir das sagen ???

CU
GOOFY

SirThornberry 20. Dez 2009 18:08

Re: Problem mit C++ Pointern
 
Das deine Übersetzung in der du "Array of" verwendest nicht richtig sein kann. Denn wenn "Array of" etwas Delphieigenes ist kann eine Übersetzung von C nach Delphi nicht "Array of" ergeben.

GOOFY009 20. Dez 2009 18:13

Re: Problem mit C++ Pointern
 
OK ... und wie "übersetze" ich dann

Delphi-Quellcode:
LPBYTE buffer = new BYTE[end-start];
?????

Laut dem was ich in Google so gefunden habe ist LPBYTE in Delphi ein PByte....

CU
GOOFY

Niko 21. Dez 2009 15:50

Re: Problem mit C++ Pointern
 
Hi,

damit das mit dem dynamischen Array funktioniert, muss das etwa so aussehen:
Delphi-Quellcode:
var
  buffer: array of Byte;
{...}

ReadProcessMemory(m_ProgHandle, Pointer(start), @buffer[0], ends - start, @bytesRead)

GOOFY009 25. Dez 2009 12:26

Re: Problem mit C++ Pointern
 
Hi !

Danke für die Lösungsvorschläge (auch wenn diese mir direkt nicht geholfen haben).

Ich habe nun die Lösung des Problems hier im Board unter andere Stelle gefunden.

Delphi-Quellcode:
TDataBuffer = Array[0..0] of Byte;
PDataBuffer = TDataBuffer;

fDataBuffer : ^PDataBuffer;

CU

GOOFY

Niko 25. Dez 2009 14:33

Re: Problem mit C++ Pointern
 
Das ist die andere Möglichkeit, wobei man üblicherweise PDataBuffer als Zeiger auf TDataBuffer deklariert. Dabei muss halt dann der notwendige Speicher mit GetMem reserviert werden.

Es spricht aber nichts dagegen, ein dynamisches Array und SetLength zu verwenden, wenn man darauf achtet, auch wirklich den Zeiger auf den Arrayinhalt zu übergeben, wie oben gezeigt.

GOOFY009 25. Dez 2009 16:09

Re: Problem mit C++ Pointern
 
Zitat:

Zitat von Niko
Es spricht aber nichts dagegen, ein dynamisches Array und SetLength zu verwenden, wenn man darauf achtet, auch wirklich den Zeiger auf den Arrayinhalt zu übergeben, wie oben gezeigt.

Warum auch immer hat dies aber nicht funktioniert !?

Warum versteh ich auch nicht aber mit der wie oben geposteten Lösung klappt es :
Delphi-Quellcode:
TDataBuffer = Array[0..0] of Byte;
PDataBuffer = ^TDataBuffer;

var
 buffer : pDataBuffer;

begin

    GetMem(buffer,ends-start);


..................
GOOFY

nanix 25. Dez 2009 20:50

Re: Problem mit C++ Pointern
 
i am also having problems with C/C++ pointers

how would this look in delphi?

ULONG_PTR=^DWORD;
nPort:ULONG;
Delphi-Quellcode:
((PUCHAR)(ULONG_PTR)nPort);


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