Hallo Leute,
ich habe hier ein bizarres Problem, mit dem ich irgendwie nicht weiterkomme.
Ersteinmal ein VB-Beispiel (welches auch funktioniert...)
Wie gesagt, das funktioniert auf meinem System auch.
Nun habe ich bisher mit folgender Umsetzung nach Delphi gearbeitet:
Das hat auch wunderbar funktioniert, obwohl eigentlich der falsche Typ (messageitem statt mailitem) übergeben wurde.
So, und nun kam ein Update und nix geht mehr. Beim Aufruf der Funktion gibts immer eine Exception Zugriffsfehler.
Ich habe dann mal meine doch mittlerweile arg verkümmerten Assemblerkenntnisse bemüht und bin soweit gekommen:
Für mich sieht das so aus, als würde er versuchen drei Parameter zu lesen. Bei rep movsd knallts dann, weil in esi leider der Wert $0 steht.
Bei der alten DLL sieht das ganze noch so aus:
Und mit der funzt es auch in Delphi.
Und nun die Frage: Was hat sich da verändert und , vor allem, wie bekomme ich den Aufruf in Delphi wieder hin? Ich habe echt keine Lust jetzt das ganze Projekt auf VB umzupfrimeln.
Danke für die Hilfe und Gruß
Torben
ich habe hier ein bizarres Problem, mit dem ich irgendwie nicht weiterkomme.
Ersteinmal ein VB-Beispiel (welches auch funktioniert...)
Code:
.... Private Declare Function DVEmlFromMailItem Lib "DvApi32" (ByVal oMailItem As DvApi32.MailItem, ByVal strFileName As String) As Long Private Sub eMail2eml_Click() 'Save all MailItems entries as .eml Dim oApp As DvApi32.IApplication Dim oAccount As DvApi32.Account Dim oArchive As DvApi32.Archive Dim oMailItem As DvApi32.MailItem Dim oMessageItems As DvApi32.MessageItems Dim Filename As String Dim i As Integer Set oApp = CreateObject("DVOBJAPILib.DvISEAPI") Set oAccount = oApp.Logon("", "", "", "", "", "AUTH") Set oArchive = oAccount.GetSpecialArchive(DvApi32.DvArchiveTypes.DvArchivePersonalIn) Set oMessageItems = oArchive.AllItems For i = 0 To oMessageItems.Count - 1 If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then oMailItem = oMessageItems.Item(i) Filename = Space(260) If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then ' In FileName are the saved EML file FileCopy FileName, "c:\" & oMailItem.Subject & ".eml" End If End If Next End Sub ...
Nun habe ich bisher mit folgender Umsetzung nach Delphi gearbeitet:
Code:
Deklaration: function DVEmlFromMailItem(const oMailItem : messageitem; const strfilename : pchar) : longint; stdcall; Implementation: function TD2SItem.DVEmlFromMailItem(const oMailItem: messageitem; const strFilename : pchar):longint; external 'DVAPI32.DLL' index 121; Aufruf: c_temp := stralloc(260); if DVEmlFromMailItem(o_messageitem,c_temp) <> 0 then begin
So, und nun kam ein Update und nix geht mehr. Beim Aufruf der Funktion gibts immer eine Exception Zugriffsfehler.
Ich habe dann mal meine doch mittlerweile arg verkümmerten Assemblerkenntnisse bemüht und bin soweit gekommen:
Code:
push ebp mov ebp,esp and esp,FFFFFFF8h sub esp,000002C4h mov eax,[L100FF24C] xor eax,esp mov [esp+000002C0h],eax mov eax,[ebp+0Ch] push ebx mov ebx,[ebp+08h] push esi mov esi,[ebx+34h] push edi mov ecx,0000006Bh lea edi,[esp+10h] rep movsd
Bei der alten DLL sieht das ganze noch so aus:
Code:
mov eax,[esp+04h] sub esp,000001B0h push esi mov esi,[eax+30h] push edi mov ecx,0000006Bh lea edi,[esp+08h] rep movsd
Und nun die Frage: Was hat sich da verändert und , vor allem, wie bekomme ich den Aufruf in Delphi wieder hin? Ich habe echt keine Lust jetzt das ganze Projekt auf VB umzupfrimeln.
Danke für die Hilfe und Gruß
Torben