AGB  ·  Datenschutz  ·  Impressum  







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

C/C++ Quellcode nach Delphi

Ein Thema von AliDi · begonnen am 31. Okt 2007 · letzter Beitrag vom 31. Okt 2007
Antwort Antwort
AliDi

Registriert seit: 3. Jul 2005
Ort: Köln
23 Beiträge
 
Delphi 2007 Professional
 
#1

C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 17:29
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 18:10
von welchem Typ ist pdwProxyRequests? Vermutlich LPDWORD oder?

folgende Zeile ist 1 zu 1 übersetzt wohl das:
Code:
pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
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:
pdwProxyRequests^ = pdwProxyRequests^ + SETAGENTGROUP;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mark90
(Gast)

n/a Beiträge
 
#3

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 18:14
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.
  Mit Zitat antworten Zitat
AliDi

Registriert seit: 3. Jul 2005
Ort: Köln
23 Beiträge
 
Delphi 2007 Professional
 
#4

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 18:14
Hallo Jens,


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

Jo, steht ja auch so im Quelltext

folgende Zeile ist 1 zu 1 übersetzt wohl das:
Code:
pdwProxyRequests = (LPDWORD)((LPBYTE)pLCP + sizeof(LINECALLPARAMS));
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:
pdwProxyRequests^ = pdwProxyRequests^ + SETAGENTGROUP;
Vielen Dank, ich werds mal ausprobieren

Gruß
Alidi
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 18:21
@Mark90:
Zitat:
in delphi
inc(^pdwProxyRequests);
fast richtig. Das dach muss hinter den Variablennamen. Das Dach davor wird nur bei der Declaration von Pointertypen verwendet.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 19:27
Zitat von SirThornberry:
Code:
*pdwProxyRequests++ = LINEPROXYREQUEST_SETAGENTGROUP;
bedeutet wenn ich mich recht entsinne:
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
AliDi

Registriert seit: 3. Jul 2005
Ort: Köln
23 Beiträge
 
Delphi 2007 Professional
 
#7

Re: C/C++ Quellcode nach Delphi

  Alt 31. Okt 2007, 21:40
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

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.

Gruß
Alidi
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:10 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