![]() |
C++ "..." ins Delphi Übersetzten
Hallo Leute,
ich übersetzte gerade wieder mal was ins Delphi. Und dabei bin ich auf vollgende Funktion gestossen:
Code:
Wie übersetzte ich das "..." ins Delphi ? *ratlos*
VixError Vix_GetProperties(VixHandle handle,
VixPropertyID firstPropertyID, ...); PS: VixError, VixHandle, VixPropertyID sind Integer <-- |
Re: C++ "..." ins Delphi Übersetzten
für mich sieht das nach offenem parameter aus wo man noch mehrere weitere parameter angeben kann.
|
Re: C++ "..." ins Delphi Übersetzten
SirThornberry hat recht. So wird das auch bei printf gemacht.
printf("Test"); printf("Zahl: %d",i); printf("Zahl: %d, noch eine: %d",i,j); usw. Natürlich kann man nicht für jede Anzahl an Parametern eine neue Funktion schreiben, deshalb gibt es "...". |
Re: C++ "..." ins Delphi Übersetzten
Stimmt vom printf kenne ich das auch aber wie schreibe ich das in Delphi ?
Delphi-Quellcode:
die Punkte gehen ja in Delphi nicht !? :(
function Vix_GetProperties(handle: VixHandle; firstPropertyID: VixPropertyID; ....): VixError;
|
Re: C++ "..." ins Delphi Übersetzten
nennt sich va_list (so auch der typ)
siehe ![]() Ich glaube aber nicht, dass man es nach Delphi so einfach portieren kann. Das muss man erstmal an einer eigenen C++ Fkt testen. Denke mal, dass "..." entweder ein Array von irgendwas(bester Fall) oder ein Pointer ist. Du müsstest also den Aufruf kapseln in einer eigenen Funktion die den Aufruf übernimmt. zum test kannste mal folgendes verwenden procedure xy(<deine Parameter>; const XY : array of const) |
Re: C++ "..." ins Delphi Übersetzten
Willst du die Signatur übersetzen, damit du die C++-Funktion in deinem Delphiprogramm aufrufen kannst, oder willst du die komplette Funktion übersetzen?
|
Re: C++ "..." ins Delphi Übersetzten
Zitat:
Delphi-Quellcode:
...
function Vix_GetProperties(handle: VixHandle; firstPropertyID: VixPropertyID; Args:array of const): VixError;
Zitat:
|
Re: C++ "..." ins Delphi Übersetzten
lass es uns wissen, wenn das Array of Const kompatibel mit dem C++ ist.
|
Re: C++ "..." ins Delphi Übersetzten
Ich weiss jetzt gerade die Syntax nicht, aber eine variable Anzahl von Parametern laesst sich in neueren Delphi-Versionen deklarieren. Die Funktion ist dann uebrigens zwingend cdecl.
va_list ist nicht die richtige Deklaration. Das ist der Mechanismus mit dem in C eine variable Anzahl Parameter implementiert wird. Dieser Mechanismus ist seinerseits in C benutzbar und ueblicherweise gibt es Funktionsfamilien mit allen Parametervarianten (namentlich printf). |
Re: C++ "..." ins Delphi Übersetzten
Zitat:
|
Re: C++ "..." ins Delphi Übersetzten
Da ich es in der Hilfe von D6 nicht gefunden habe, duerfte es erst ab D7 implementiert sein. Schau dir mal die Hilfe zu Parametern an.
|
Re: C++ "..." ins Delphi Übersetzten
Mein Delphi 2005 Personal kennt nur offene Array-Parameter, und die sind ganz anders implementiert als in C.
|
Re: C++ "..." ins Delphi Übersetzten
Ah, endlich gefunden, also auch in D6. varargs Direktive. Nur fuer externe Deklarationen in DLLs.
Delphi-Quellcode:
function Vix_GetProperties(handle: VixHandle; firstPropertyID: VixPropertyID): VixError; cdecl; varargs;
|
Re: C++ "..." ins Delphi Übersetzten
Danke für den Tipp.
Ich habe es eben getestet. Ein Kuriosum ist an dieser Stelle, dass bei mir auch ohne cdecl warnungsfrei kompiliert wird, und auf Assemblerebene kann man die Aufrufkonvention register erkennen. Da sollte der Compiler mindestens eine Warnung schmeißen (bei mehr als drei Parametern ist schließlich der Stack futsch) oder besser noch abbrechen. |
Re: C++ "..." ins Delphi Übersetzten
So kommen wir nun zur auflösung ^^
nach vielen Test habe ich rausgefunden das
Delphi-Quellcode:
das geht :cheers:
function Vix_GetProperties(handle: VixHandle; firstPropertyID: VixPropertyID): VixError; cdecl; varargs;
Danke allen für die Hilfe ;-) |
Re: C++ "..." ins Delphi Übersetzten
Ich habe mal wieder eine übersetzungs frage :gruebel: .
Code:
habe ich so versucht
#define NETWORK_ADDRESS_LENGTH_IP sizeof (NETWORK_ADDRESS_IP)
Delphi-Quellcode:
aber es kommt der Fehler :
Tndu_NETWORK_ADDRESS_LENGTH_IP = SizeOf(Tndu_NETWORK_ADDRESS_IP);
Zitat:
|
Re: C++ "..." ins Delphi Übersetzten
Das ist eine Konstante.
|
Re: C++ "..." ins Delphi Übersetzten
Ah ok :oops: aber jetzt noch mal eine Frage
Code:
Macht das überhaupt sinn eine Struktur in einer Sturktur ... wenn nix weiter kommt !? :gruebel:
typedef struct _NDIS_TCP_LARGE_SEND_OFFLOAD_V1
{ struct { ULONG Encapsulation; ULONG MaxOffLoadSize; ULONG MinSegmentCount; ULONG TcpOptions:2; ULONG IpOptions:2; } IPv4; } NDIS_TCP_LARGE_SEND_OFFLOAD_V1, *PNDIS_TCP_LARGE_SEND_OFFLOAD_V1; Vor allem im Variabelnamen ":2" was soll das :gruebel: :wiejetzt: |
Re: C++ "..." ins Delphi Übersetzten
Das mit dem :2 kann ich auch nicht beantworten (konnt jetzt auch im MSDN nicht rauslesen).
Vielleicht kommen ja in den anderen NDIS_TCP_LARGE_SEND_OFFLOAD_V* ja noch weitere Strukturen dazu und die wollten einfach nur bei allen Diesen einen gleichen/ähnlichen Aufbau. :zwinker: (praktisch nur etwas logischer für den Programmierer, daber sonst hat es keinen wirklichen Sinn) |
Re: C++ "..." ins Delphi Übersetzten
Ah ok also wenn ich das auch so mache müsste das aber Funktionieren ?
Delphi-Quellcode:
Tndu_NDIS_TCP_LARGE_SEND_OFFLOAD_V1 = record
IPv4: record Encapsulation: ulong; MaxOffLoadSize: ulong; MinSegmentCount: ulong; TcpOptions: ulong; //TcpOptions:2; IpOptions: ulong; //IpOptions:2; end; end; |
Re: C++ "..." ins Delphi Übersetzten
Sind die Dinger mit den Doppelpunkten nicht Bitfelder? Also nicht wirklich zwei ULONGs, sondern je zwei Bit lange vorzeichenlose Integer :stupid:
|
Re: C++ "..." ins Delphi Übersetzten
Jupp (abgesehn von dem :2 )
vom inneren Speicheraufbau entspricht es ja genau Folgendem, aber mit dem Doppelrecord liegt es wenigstens nah an Windows seiner Definition, was logisch besser wäre.
Delphi-Quellcode:
wegen dem ...Options, im MSDN steh jedenfalls nur was von "A ULONG value that a miniport driver sets to indicate ...", also für'n Anfang würde ich es wohl auch erstmal so versuchen :stupid:
Tndu_NDIS_TCP_LARGE_SEND_OFFLOAD_V1 = record
Encapsulation: ulong; MaxOffLoadSize: ulong; MinSegmentCount: ulong; TcpOptions: ulong; //TcpOptions:2; IpOptions: ulong; //IpOptions:2; end; [add] Zitat:
Code:
[color=silver]TcpOptions: LongBool;
IpOptions: LongBool;[/color] |
Re: C++ "..." ins Delphi Übersetzten
Naja, mit LongBool kommste nicht hin, weil das original laut Definition aus 2 Bits besteht. Somit haben sie 2^2 mögliche Kombinationen und nicht nur 2^1.
Die Definition besagt, diese Variable belegt nur Bit 0 und 1 und kann somit auch nur Werte zwischen 0 und 3 aufnehmen. |
Re: C++ "..." ins Delphi Übersetzten
Wie sieht denn das nu im Delphi aus :gruebel: und wieso steht dann ulong da wenn dann durch das ":2" was anderes rauskommt ?
Die logig verstehe ich dahinter nicht ! :roll: |
Re: C++ "..." ins Delphi Übersetzten
In C definiert man so eben Bitfelder. Man nimmt einen zugrundeliegenden Typ und teilt ihn in Bits auf. z.B.
Code:
ergibt eine Struktur, die ein Byte in Nibbles einteilt. Ich glaube, solange es alles passt und man den Typ zwischendurch nicht ändert, ergibt der Typ die Gesamtgröße. Du könntest also probieren, deine aufeinanderfolgenden Bitfelder als einen ULONG zu definieren, eigentlich müsste die Größe hinkommen.
struct {
unsigned char highnibble: 4; unsigned char lownibble: 4; }; |
Re: C++ "..." ins Delphi Übersetzten
Beide Bitfelder liegen in einem LONG, somit einem LongWord. Dabei sind TCPOptions Bit 0 & 1 und IPOptions sind Bit 2 & 3.
Ansonsten nochmal kurz ![]() |
Re: C++ "..." ins Delphi Übersetzten
mal wieder was Neues gelernt :shock:
also wenn die Beiden jetzt im Grunde in dem selben ULONG/LongWord drinliegen, dann sieht es wohl so aus :angel2:
Delphi-Quellcode:
type
_NDIS_TCP_LARGE_SEND_OFFLOAD_V1 = record IPv4: record Encapsulation: LongWord; MaxOffLoadSize: LongWord; MinSegmentCount: LongWord; Tcp_Ip_Options: LongWord; end; end; NDIS_TCP_LARGE_SEND_OFFLOAD_V1 = _NDIS_TCP_LARGE_SEND_OFFLOAD_V1; PNDIS_TCP_LARGE_SEND_OFFLOAD_V1 = ^_NDIS_TCP_LARGE_SEND_OFFLOAD_V1; const TcpOptionsMask = $00000003; IpOptionsMask = $0000000C; |
Re: C++ "..." ins Delphi Übersetzten
<stimme vom sesamstrassen-buchstaben-dealer> Genaauuuu </stimme vom sesamstrassen-buchstaben-dealer>
|
Re: C++ "..." ins Delphi Übersetzten
So erstmal danke für das bisherige ;-) aber es geht weiter ! ^^
Habe nun folgendes gefunden
Code:
und das
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note // that function codes 0-2047 are reserved for Microsoft Corporation, and // 2048-4095 are reserved for customers. // #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ )
Code:
#define _NDIS_CONTROL_CODE(request,method) \
CTL_CODE(FILE_DEVICE_PHYSICAL_NETCARD, request, method, FILE_ANY_ACCESS) #define IOCTL_NDIS_QUERY_GLOBAL_STATS _NDIS_CONTROL_CODE(0, METHOD_OUT_DIRECT) und als weiteres
Code:
Wie übersetzt ich das ins Delphi :-D ?
#if ((NTDDI_VERSION >= NTDDI_LONGHORN) || NDIS_SUPPORT_NDIS6)
.... #endif // (NTDDI_VERSION >= NTDDI_LONGHORN) |
Re: C++ "..." ins Delphi Übersetzten
Code:
das ist ein Makro ... sowas kennt Delphi nicht.
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and // 2048-4095 are reserved for customers. #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ ) entweder du machst eine Funktion draus oder du rechnest es direkt aus. zu Zweitem: du könntest (was wohl am Besten sein wird) dieses direkt in der Konstante ausrechnen lassen: mußt dann nur deine Konstantendefinition nach diesem Muster umsetzen
Delphi-Quellcode:
... su kannst es natürlich auch selber ausrechnen und der Konstante den errechneten Wert zuweisen.
const {ConstName} = ({DeviceType} shl 16) or ({Access} shl 14) or ({Function} shl 2) or {Method};
Code:
#define xyz
#if xyz ... #endif
Delphi-Quellcode:
siehe OH :zwinker:
{$DEFINE xyz}
{$IFDEF xyz} ... {$ENDIF} |
Re: C++ "..." ins Delphi Übersetzten
Ok Danke ^^ ich probiere es aus ... bei der letzten sache ging es mehr ähr darum wie rausbekomme welche Windows Version das ist und dem entsprechent die Funktion oder Variable einblende oder nicht :roll:
|
Re: C++ "..." ins Delphi Übersetzten
Mit Compilerdirektiven kann man die Windowsversion nicht ermitteln/prüfen ... diese werden vom Compiler ausgewertet und sind unabhängig von der Windowsversion wo dann das kompilierte Programm drauf läuft.
Du kannst höchstens ermitteln mit welche Compilereinstellungen und welchen Bibliotheken das Programm kompiliert wird ... also z.B. für welche Zielplattformen die Anwendung vorgesehn ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz