Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C/C++ Quellcode nach Delphi (https://www.delphipraxis.net/102592-c-c-quellcode-nach-delphi.html)

AliDi 31. Okt 2007 16:29


C/C++ Quellcode nach Delphi
 
Hallo,

habe folgenden C/C++ Quellcode und habe Probleme damit diesen nach Delphi umzusetzen:

Code:
 LPLINECALLPARAMS   pLCP;
 LONG               lResult;
 LPDWORD            pdwProxyRequests;

    pLCP = (LPLINECALLPARAMS)ACDAlloc(sizeof(LINECALLPARAMS) + 7*sizeof(DWORD));

    pLCP->dwTotalSize          = sizeof(LINECALLPARAMS) + 7*sizeof(DWORD);
    pLCP->dwDevSpecificOffset  = sizeof(LINECALLPARAMS);
    pLCP->dwDevSpecificSize    = sizeof(DWORD) * 7;

    pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
    // each constant is in a DWORD at the end of LINECALLPARAMS
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTSTATE;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTACTIVITY;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTSTATUS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTCAPS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTACTIVITYLIST;
    *pdwProxyRequests  = LINEPROXYREQUEST_GETAGENTGROUPLIST;

folgendes habe ich bereits:
Delphi-Quellcode:
var
pLCP: LPLINECALLPARAMS;
gr: LongInt;
pdwProxyRequests: LPDWORD;
begin

gr:= sizeOf (TLINECALLPARAMS) + sizeOf(Integer)* 7;
getMem (pLCP, gr);

 pLCP.dwTotalSize:= sizeOf(TLINECALLPARAMS) + 7 * sizeOf(Integer);

 pLCP.dwDevSpecificSize:= sizeOf(Integer) * 7;
 pLCP.dwDevSpecificOffset:= sizeOf (TLINECALLPARAMS);

freeMem (pLCP, gr);
nur wie setze ich dieses Konstrukt um?
Code:
   pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
    // each constant is in a DWORD at the end of LINECALLPARAMS
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTSTATE;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTACTIVITY;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTSTATUS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTCAPS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTACTIVITYLIST;
    *pdwProxyRequests  = LINEPROXYREQUEST_GETAGENTGROUPLIST;
Viele Grüße
Alidi

SirThornberry 31. Okt 2007 17:10

Re: C/C++ Quellcode nach Delphi
 
von welchem Typ ist pdwProxyRequests? Vermutlich LPDWORD oder?

folgende Zeile ist 1 zu 1 übersetzt wohl das:
Code:
pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
Delphi-Quellcode:
pdwProxyRequests = PDWORD(Cardinal(pLCP) + sizeof(LINECALLPARAMS));
Es wird also ausgehend von pLCP (was ein Pointer ist) etwas dazu addiert um die neue Adresse zu bekommen.

und
Code:
*pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
bedeutet wenn ich mich recht entsinne:
Delphi-Quellcode:
pdwProxyRequests^ = pdwProxyRequests^ + SETAGENTGROUP;

Mark90 31. Okt 2007 17:14

Re: C/C++ Quellcode nach Delphi
 
Code:
pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
    // each constant is in a DWORD at the end of LINECALLPARAMS
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTSTATE;
    *pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTACTIVITY;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTSTATUS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTCAPS;
    *pdwProxyRequests++ = LINEPROXYREQUEST_GETAGENTACTIVITYLIST;
    *pdwProxyRequests  = LINEPROXYREQUEST_GETAGENTGROUPLIST;
hi,

in der 1. zeile: mit (LPDWORT) konvertiertst du ((LPBYTE)pLCP + ... in einen LPDWORD. mit LPBYTE konveritest du pLCP in einen LPBYTE.

Code:
*pdwProxyRequests++
Delphi-Quellcode:
in delphi
inc(^pdwProxyRequests);


dereferenzierung des pointers pdwProxyRequests (das p vor pdwProxyRequests steht für pointer) und erhöhung des arguments um eins, was bedeutet: pdwProxyRequest = pdwProxyRequests + 1; oder inc(pdwProxyRequests) in delphi und asm.

AliDi 31. Okt 2007 17:14

Re: C/C++ Quellcode nach Delphi
 
Hallo Jens,


Zitat:

Zitat von SirThornberry
von welchem Typ ist pdwProxyRequests? Vermutlich LPDWORD oder?

Jo, steht ja auch so im Quelltext :-D

folgende Zeile ist 1 zu 1 übersetzt wohl das:
Code:
pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
Delphi-Quellcode:
pdwProxyRequests = PDWORD(Cardinal(pLCP) + sizeof(LINECALLPARAMS));
Es wird also ausgehend von pLCP (was ein Pointer ist) etwas dazu addiert um die neue Adresse zu bekommen.

und
Code:
*pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
bedeutet wenn ich mich recht entsinne:
Delphi-Quellcode:
pdwProxyRequests^ = pdwProxyRequests^ + SETAGENTGROUP;

Vielen Dank, ich werds mal ausprobieren

Gruß
Alidi

SirThornberry 31. Okt 2007 17:21

Re: C/C++ Quellcode nach Delphi
 
@Mark90:
Zitat:

in delphi
Delphi-Quellcode:
inc(^pdwProxyRequests);

fast richtig. Das dach muss hinter den Variablennamen. Das Dach davor wird nur bei der Declaration von Pointertypen verwendet.

Apollonius 31. Okt 2007 18:27

Re: C/C++ Quellcode nach Delphi
 
Zitat:

Zitat von SirThornberry
Code:
*pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
bedeutet wenn ich mich recht entsinne:
Delphi-Quellcode:
pdwProxyRequests^ = pdwProxyRequests^ + SETAGENTGROUP;

Ich glaube, da verwechselst du was, Sir T. Meiner Meinung nach wäre das in C
Code:
*pdwProxyRequests+ = LINEPROXYREQUEST_SETAGENTGROUP;
Die Variante mit dem doppelten Plus würde ich folgendermaßen übersetzen:
Delphi-Quellcode:
pdwProxyRequests^ = LINEPROXYREQUEST_SETAGENTGROUP;
inc(pdwProxyRequests);
Denn: Ein einfaches pdwProxyRequests++ hieße inc(pdwProxyRequests). Eine Zuweisung, auch eine solche einfache, gibt in C etwas zurück, in diesem Fall, da das ++ nachgestellt wird, den ursprünglichen Wert. Dieser wird dereferenziert und ihm etwas zugewiesen. Ich halte dies auch für logisch: Der Zeiger pdwProxyRequests wird hinter die Struktur gesetzt und dorthin dann DWords gesetzt, wie es auch der Kommentar sagt.

Irgendwo ist man da doch froh, dass in Delphi Zuweisungen keinen Wert haben.

AliDi 31. Okt 2007 20:40

Re: C/C++ Quellcode nach Delphi
 
Zitat:

Zitat von Apollonius

Ich glaube, da verwechselst du was, Sir T. Meiner Meinung nach wäre das in C
Code:
*pdwProxyRequests+ = LINEPROXYREQUEST_SETAGENTGROUP;
Die Variante mit dem doppelten Plus würde ich folgendermaßen übersetzen:
Delphi-Quellcode:
pdwProxyRequests^ = LINEPROXYREQUEST_SETAGENTGROUP;
inc(pdwProxyRequests);
Denn: Ein einfaches pdwProxyRequests++ hieße inc(pdwProxyRequests). Eine Zuweisung, auch eine solche einfache, gibt in C etwas zurück, in diesem Fall, da das ++ nachgestellt wird, den ursprünglichen Wert. Dieser wird dereferenziert und ihm etwas zugewiesen. Ich halte dies auch für logisch: Der Zeiger pdwProxyRequests wird hinter die Struktur gesetzt und dorthin dann DWords gesetzt, wie es auch der Kommentar sagt.

Das war der entscheidende Hinweis :hello:

so funktionierts jetzt:
Delphi-Quellcode:
 pdwProxyRequests:= PDWORD(Cardinal(pLCP) + sizeof(TLINECALLPARAMS));

 pdwProxyRequests^ := LINEPROXYREQUEST_SETAGENTGROUP;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_SETAGENTSTATE;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_SETAGENTACTIVITY;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_GETAGENTSTATUS;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_GETAGENTCAPS;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_GETAGENTACTIVITYLIST;
 inc(pdwProxyRequests);

 pdwProxyRequests^ := LINEPROXYREQUEST_GETAGENTGROUPLIST;

Vielen Dank für die schnelle Hilfe. :cheers:

Gruß
Alidi


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