Autor Beitrag
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Administrator
Beiträge: 217
Erhaltene Danke: 96



BeitragVerfasst: Mi 30.01.19 15:13 
Mahlzeit Leute,

meine Pascal Kenntnisse sind etwas eingerostet. Ich habe folgende Procedure in C:

ausblenden Quelltext
1:
int smfi_setmlreply(SMFICTX *ctx, char *rcode, char *xcode, ...);					


Aufgerufen wird dies wie folgt:

ausblenden 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:

ausblenden 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



BeitragVerfasst: Mi 30.01.19 15:35 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4437
Erhaltene Danke: 910


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 30.01.19 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1193
Erhaltene Danke: 100

Win7
DXE2 Prof, Lazarus
BeitragVerfasst: Mi 30.01.19 16: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.

ausblenden 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: stringconst lines: array of string): integer;
var
  l: integer;
  sl: TStringList;

begin
  sl := TStringList.Create;
  try
    // als beispiel : alle strings in eine liste
    sl.Add(rcode);
    sl.Add(xcode);
    for l := 0 to Length(lines)-1 do
      sl.Add(lines[l]);
  finally
    sl.Free;
  end;
end;

// aufruf
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.

_________________
Solange keine Zeile Code geschrieben ist, läuft ein Programm immer fehlerfrei.
Ich teste nicht, weil ich Angst habe Fehler zu finden.

Für diesen Beitrag haben gedankt: Tankard
Tankard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Administrator
Beiträge: 217
Erhaltene Danke: 96



BeitragVerfasst: Mi 30.01.19 16:12 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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


ausblenden volle Höhe Quelltext
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

};




user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
docwiki.embarcadero....d_Functions_(Delphi)

Siehe den Punkt "External Declarations"

Zusammenfassung. Lass die Punkte weg und hänge die varargs Direktive an die Function.


Danke. Die kannte ich noch nicht und siehe da funktioniert sogar ;)