Autor |
Beitrag |
Tankard
Beiträge: 217
Erhaltene Danke: 96
|
Verfasst: Mi 30.01.19 16:13
Mahlzeit Leute,
meine Pascal Kenntnisse sind etwas eingerostet. Ich habe folgende Procedure in C:
Quelltext 1:
| int smfi_setmlreply(SMFICTX *ctx, char *rcode, char *xcode, ...); |
Aufgerufen wird dies wie folgt:
Quelltext 1: 2: 3: 4: 5:
| ret = smfi_setmlreply(ctx, "550", "5.7.0", "Spammer access rejected", "Please see our policy at:", "http://www.example.com/spampolicy.html", NULL); |
Nun möchte ich dies nach Pascal übersetzen. Die ersten Parameter sind kein Problem, nur bei dem ... wird es schwierig:
Quelltext 1:
| function smfi_setmlreply (ctx:SMFICTX; rcode,xcode:PChar, ...): Integer; cdecl; external; |
Die Punkte mag Pascal natürlich nicht. Vielleicht hat einer eine Idee.
Gruß Tankard
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 30.01.19 16:35
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 30.01.19 16:54
docwiki.embarcadero....d_Functions_(Delphi)
Siehe den Punkt "External Declarations"
Zusammenfassung. Lass die Punkte weg und hänge die varargs Direktive an die Function.
Für diesen Beitrag haben gedankt: Tankard
|
|
Sinspin
Beiträge: 1332
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 30.01.19 17:10
Davon ausgehend das hier nicht alle Fragen von Kiddies gestellt werden die man schlicht anrotzen kann um sie vieleicht zu etwas mehr Fleiß zu ermuntern, kann man auch wie folgt Antworten.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function smfi_setmlreply(var ctx: SMFICTX; rcode, xcode: string; const lines: array of string): integer; var l: integer; sl: TStringList;
begin sl := TStringList.Create; try sl.Add(rcode); sl.Add(xcode); for l := 0 to Length(lines)-1 do sl.Add(lines[l]); finally sl.Free; end; end;
smfi_setmlreply(Vctx, '404', '3.1415', ['Ich','bin','5','zeilen','text']); |
Was in C mit den drei Punkten (Ellipse) geht muss man in Delphi als array Parameter angeben.
So wie es zum Beispiel von der Funktion Format erwartet wird.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Für diesen Beitrag haben gedankt: Tankard
|
|
Tankard
Beiträge: 217
Erhaltene Danke: 96
|
Verfasst: Mi 30.01.19 17:12
Frühlingsrolle hat folgendes geschrieben : | Guten Tag Tankard,
bist du davon ausgegangen, dass die Punkte als Parameter durchgehen werden?
Schau' doch mal in der Doku nach, wofür die Punkte stellvertretend sind.
Hast du eine Headerdatei diesbezüglich? Was genau ist denn der Typ "SMFICTX"? |
SMFICTX ist ein einfacher Record, wo die Callback Funktionen, Name des Mailfilters etc. hinterlegt sind.
Hier geht es um einen Filter für Postfix/Sendmail. Ich würde diesen zwar lieber in C programmieren, aber leider kann mein Kunde kein C, sondern hätte gerne eine Pascal Version. Die Sourcen für die LibMilter Lib gibt es z.B. von ftp.sendmail.org. bzw auf github. unter :
github.com/jons/libmilter
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| struct smfiDesc { char *xxfi_name; /* filter name */ int xxfi_version; /* version code -- do not change */ unsigned long xxfi_flags; /* flags */
/* connection info filter */ /* sfsistat (*xxfi_connect) SM__P((SMFICTX *, char *, _SOCK_ADDR *));*/
/* SMTP HELO command filter */ /* sfsistat (*xxfi_helo) SM__P((SMFICTX *, char *));*/
/* envelope sender filter */ /* sfsistat (*xxfi_envfrom) SM__P((SMFICTX *, char **)); */
/* envelope recipient filter */ /* sfsistat (*xxfi_envrcpt) SM__P((SMFICTX *, char **)); */
/* header filter */ /* sfsistat (*xxfi_header) SM__P((SMFICTX *, char *, char *));*/
/* end of header */ /* sfsistat (*xxfi_eoh) SM__P((SMFICTX *));*/
/* body block */ /* sfsistat (*xxfi_body) SM__P((SMFICTX *, unsigned char *, size_t));*/
/* end of message */ /* sfsistat (*xxfi_eom) SM__P((SMFICTX *));*/
/* message aborted */ /* sfsistat (*xxfi_abort) SM__P((SMFICTX *));*/
/* connection cleanup */ /* sfsistat (*xxfi_close) SM__P((SMFICTX *));*/
/* any unrecognized or unimplemented command filter */ /* sfsistat (*xxfi_unknown) SM__P((SMFICTX *, const char *));*/
/* SMTP DATA command filter */ /* sfsistat (*xxfi_data) SM__P((SMFICTX *)); */
/* negotiation callback */ /* sfsistat (*xxfi_negotiate) SM__P((SMFICTX *, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long *, unsigned long *, unsigned long *, unsigned long *)); */ #if 0 /* signal handler callback, not yet implemented. */ /* int (*xxfi_signal) SM__P((int));*/ #endif
}; |
Danke. Die kannte ich noch nicht und siehe da funktioniert sogar
|
|
|