Announcement

Collapse
No announcement yet.

Verständnisfrage zu MAPI

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisfrage zu MAPI

    Hallo zusammen,

    ich hatte gestern ein seltsames Phänomen, dass ich mir nicht erklären kann. Ich wollte meinem Objekt "MapiMessage: TMapiMessage" mehrere FileAttach (dynamisches Array) zuweisen:
    <pre>
    FileAttach[0].nPosition := Cardinal($FFFFFFFF);
    FileAttach[0].lpszPathName := PChar(ListBox.Items.Strings[var_iZaehler]);
    FileAttach[0].lpszFileName := PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler]));
    FileAttach[1].nPosition := Cardinal($FFFFFFFF);
    FileAttach[1].lpszPathName := PChar(ListBox.Items.Strings[var_iZaehler]);
    FileAttach[1].lpszFileName := PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler]));
    FileAttach[2].nPosition := Cardinal($FFFFFFFF);
    FileAttach[2].lpszPathName := PChar(ListBox.Items.Strings[var_iZaehler]);
    FileAttach[2].lpszFileName := PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler]));
    FileAttach[3].nPosition := Cardinal($FFFFFFFF);
    FileAttach[3].lpszPathName := PChar(ListBox.Items.Strings[var_iZaehler]);
    FileAttach[3].lpszFileName := PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler]));
    USW......
    </pre>
    Das ganze funktioniert wunderbar, jedoch finde ich es komisch, dass eine solche Zuweisung in einer Schleife nicht funktioniert:
    <pre>
    while var_iZaehler < MapiMessage.nFileCount do
    begin
    FileAttach[var_iZaehler].nPosition := Cardinal($FFFFFFFF);
    FileAttach[var_iZaehler].lpszPathName := PChar(ListBox.Items.Strings[var_iZaehler]);
    FileAttach[var_iZaehler].lpszFileName := PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler]));
    inc(var_iZaehler);
    end;
    </pre>
    Es funktioniert erst, wenn man die Werte mit einem StrNew zuweist:
    <pre>
    while var_iZaehler < MapiMessage.nFileCount do
    begin
    FileAttach[var_iZaehler].nPosition := Cardinal($FFFFFFFF);
    FileAttach[var_iZaehler].lpszPathName := StrNew(PChar(ListBox.Items.Strings[var_iZaehler]));
    FileAttach[var_iZaehler].lpszFileName := StrNew(PChar(ExtractFileName(ListBox.Items.Strings[var_iZaehler])));
    inc(var_iZaehler);
    end;
    </pre>
    Woran liegt das?

  • #2
    Hallo,

    das Problem hat nichts direkt mit MAPI zu tun, sondern mehr mit dem Thema nullterminierte Strings. Hinter <i>lpszPathName</i> verbirgt sich ein Zeiger auf einen nullterminierten String, aber Delphi hat ja eine clevere eigene Stringverwaltung. Immer dann, wenn beide Welten aufeinandertreffen, sind einige Besonderheiten zu beachten (siehe Hilfeseite zu <b>UniqueString</b>). Die "harte" Typumwandlung über PChar führt nicht in allen Fällen zum gewünschten Ergebnis. Der Aufruf von StrNew liefert in jedem Fall einen "richtigen" (eindeutigen) Zeiger auf eine frisch erzeugte/umkopierte Zeichenkette zurück

    Comment

    Working...
    X