TSittly - Mo 08.05.06 14:29
Titel: Attachments mit ExtendedMAPI
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...)
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..2] of TSPropValue; ulAttachNum : ULONG; hr : HRESULT; wcsAttachmentName : string; dwFileSize: integer; ulStatus : integer; pstmAttachment : IStream; szBuf : string; Demoname: WChar; begin pAttachment := Nil;
wcsAttachmentName := 'test.txt';
ulStatus := MSGSTATUS_RECTYPE_SMTP; pstmAttachment := nil; szBuf := 'Hallo, Demo';
dwFileSize := Length(szBuf)+1; hr := MAPIMessage.CreateAttach(Nil, 0, 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'; 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(1, @rgpropsAttch, PSPropProblemArray(Nil^));
if Failed(hr) then begin ShowMessage('Fehler CreateAttachment SetProps'); Exit; end;
hr := pAttachment.OpenProperty(PR_ATTACH_DATA_BIN, @IID_IStream, STGM_WRITE, MAPI_CREATE or MAPI_MODIFY or MAPI_DEFERRED_ERRORS, IUnknown(pstmAttachment)); if Failed(hr) then begin ShowMessage('Fehler CreateAttachment OpenProperty'); Exit; end;
hr := pstmAttachment.Write(PChar(szBuf), 5, Nil); if Failed(hr) then begin ShowMessage('Fehler CreateAttachment Write Buf'); Exit; end;
hr := pstmAttachment.Commit(STGC_DEFAULT); if Failed(hr) then begin ShowMessage('Fehler CreateAttachment Commit'); Exit; end;
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 - 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....
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