Autor Beitrag
TSittly
Hält's aus hier
Beiträge: 9

AmigaOS3.5

BeitragVerfasst: Mo 08.05.06 14:29 
Wenn ich ein Attachment mit der ExtendedMAPI Library von IMI (imibo.com) versenden möchte, passieren seltsame Fehler.
Zum einen wird der Name des Attachments nicht richtig angezeigt. Bei Outlook wird kein Name angezeigt, aber durch Doppelklick offenbart sich der erste Buchstabe des Namens.
Speichern kann man diese Datei auch nicht (Dieses Verzeichnis existiert nicht).
Den Teil des Codes habe ich aus offiziellem Code kopiert und entsprechend für Delphi umgeschrieben:
(Die Datei ist hier zum Test noch virtuell, möchte es erst dann richtig machen, wenns auch tut...)

ausblenden volle Höhe Delphi-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:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
procedure AttachFile;
var
  pAttachment : IAttach;
  rgpropsAttch : array [0..2of TSPropValue;
  ulAttachNum : ULONG;
  hr : HRESULT;
  wcsAttachmentName : string;
  dwFileSize: integer;
  ulStatus : integer;
  pstmAttachment : IStream;
  szBuf : string//DEMO

  Demoname: WChar;
begin
  pAttachment := Nil;

  // bogus filename...normally would reference a real file
  // Diese werden später wie Recipients in einer Liste gehalten und per
  //Schleife einzeln upgeloaded
  wcsAttachmentName := 'test.txt';

  ulStatus := MSGSTATUS_RECTYPE_SMTP;  //Hilfe...keine Referenzen...welchen Wert hat dieses??
  //ulStatus := 0;
  pstmAttachment := nil;
  // our fake file data, normally would be streamed in from a file
  szBuf := 'Hallo, Demo';

  dwFileSize := Length(szBuf)+1;
  // create the attachment
  hr := MAPIMessage.CreateAttach(Nil0, ulAttachNum, pAttachment);

  if Failed(hr) then begin
     ShowMessage('Fehler CreateAttachment');
     Exit;
  end;

  ZeroMemory(@rgpropsAttch,SizeOf(rgpropsAttch));

  rgpropsAttch[0].ulPropTag    :=   PR_ATTACH_FILENAME;
  rgpropsAttch[0].Value.lpszA := PChar(wcsAttachmentName);

  rgpropsAttch[0].Value.lpszW := 'Demoname UTF'//Muss irgendwie von 8Bit nach UTF16 kopiert werden...

  rgpropsAttch[1].ulPropTag    :=   PR_ATTACH_SIZE;
  rgpropsAttch[1].Value.ul     :=   dwFileSize;

  rgpropsAttch[2].ulPropTag    :=   PR_MSG_STATUS;
  rgpropsAttch[2].Value.ul     :=   ulStatus;

  //hr := pAttachment.SetProps(ULONG(SizeOf(rgpropsAttch) div SizeOf(rgpropsAttch[0])), @rgpropsAttch, PSPropProblemArray(Nil^));
  hr := pAttachment.SetProps(1, @rgpropsAttch, PSPropProblemArray(Nil^));

  if Failed(hr) then begin
     ShowMessage('Fehler CreateAttachment SetProps');
     Exit;
  end;

  // open a stream on the attachment
  hr := pAttachment.OpenProperty(PR_ATTACH_DATA_BIN, @IID_IStream, STGM_WRITE, MAPI_CREATE or MAPI_MODIFY or MAPI_DEFERRED_ERRORS, //STGM_WRITE, MAPI_MODIFY,
                                  IUnknown(pstmAttachment));
  if Failed(hr) then begin
     ShowMessage('Fehler CreateAttachment OpenProperty');
     Exit;
  end;

  // store chunk from our fake file buffer into the stream
  hr := pstmAttachment.Write(PChar(szBuf), 5Nil);
  if Failed(hr) then begin
     ShowMessage('Fehler CreateAttachment Write Buf');
     Exit;
  end;

  // commit it
  hr := pstmAttachment.Commit(STGC_DEFAULT);
  if Failed(hr) then begin
     ShowMessage('Fehler CreateAttachment Commit');
     Exit;
  end;

  //hr := MAPIMessage.SaveChanges(KEEP_OPEN_READWRITE);
  hr := pAttachment.SaveChanges(KEEP_OPEN_READWRITE);

  pAttachment := nil;
  pstmAttachment := nil;
end;


Da ich eigentlich nie was mit Windows mach, fällt mir der Fehler sicher nur nicht auf, aber vielleicht sieht jemand von euch den Fehler?
Übrigens: Welchen Wert hat MSGSTATUS_RECTYPE_SMTP ? Ich konnte das bisher nicht ermitteln.
Ebenso ist mir unklar, die ich UTF-Text als Dateinamen verwenden kann. Mache ich 'T'+#0+'e'+#0+'s'+#0+'t'+#0 passiert genau das gleiche wie bei 'Test', es wird auch nur der erste Buchstabe (T in diesem Fall) angezeigt.
TSittly Threadstarter
Hält's aus hier
Beiträge: 9

AmigaOS3.5

BeitragVerfasst: Di 09.05.06 13:47 
Habs selbst hinbekommen, danke für die vielen Antworten.
Attachments gehen nun auch, nur gibt es noch ein Problem: Outlook kann die Dateien nicht anzeigen oder speichern. Das Delphi-Demo IPMViewAndSend aus der ExtendedMAPI Library von IMI kan die Attachments aber lesen und speichern. Es ist wohl ein Flag-Problem.

Und zwar vermute ich daß es am MSGSTATUS_RECTYPE_SMTP liegt. Ich habe keine Datei, die eine Definition dafür beinhaltet.
Kann jemand ein kurzes Demo schreiben, und im Debugmodus mit der Maus drüberfahren, um mir den Wert zu nennen?

Falls auch das zuviel ist, hier ein Code den man einfach kopieren kann....

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Test;
var
  Wert : integer;
begin
  Wert := MSGSTATUS_RECTYPE_SMTP;
end;


Was natürlich sehr freundlich wäre, wäre eine Liste der MSGSTATUS_RECTYPE_XXX (oder eben die entsprechende Datei)
Danke im Voraus
TSittly Threadstarter
Hält's aus hier
Beiträge: 9

AmigaOS3.5

BeitragVerfasst: Di 09.05.06 15:43 
Ok habs selbst hinbekommen...vielleicht sollte ich das Forum wechseln....