Announcement

Collapse
No announcement yet.

Problem mit Funktionsaufruf nach Update der DLL

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

  • Problem mit Funktionsaufruf nach Update der DLL

    Hallo Leute,

    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 
    ...
    Wie gesagt, das funktioniert auf meinem System auch.

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

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

    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 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
Working...
X