Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Einbindung in VB, VBA bzw. Lotus-Script (https://www.delphipraxis.net/9888-dll-einbindung-vbulletin-vba-bzw-lotus-script.html)

FriFra 7. Okt 2003 10:03


DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Ich habe eine dll mit Delphi erstellt und will diese nun z.B. in VBA nutzen,

Exports meiner dll
Delphi-Quellcode:
...
exports
  GetMails(Mails: PChar; KillDuplicates, RealNameEnabled, RealNameSimulated,
    FromOutlook, FromOpera, FromNetscape, FromLotusNotes, FromEudora, FromPegasus:
    boolean)name 'GetMails',
  GetMails(Mailfile: string; KillDuplicates, RealNameEnabled, RealNameSimulated,
    FromOutlook, FromOpera, FromNetscape, FromLotusNotes, FromEudora, FromPegasus:
    boolean)name 'GetMails_File';
...
GetMails_File habe ich momentan als Work-Around für VB in meinem Projekt, da ich keien Plan habe wie ich in VB mit Pointern (Mails: PChar) umgehen soll. Deshalb schreibe ich den text jetzt in eine Datei die man nach dem Aufruf einlesen kann:
Code:
Declare Function GetMails Lib "localmail.dll" Alias "GetMails_File" (ByVal Mialfile As String, ByVal KillDuplicates As Integer, ByVal RealNameEnabled As Integer, ByVal RealNameSimulated As Integer, ByVal FromOutlook As Integer, ByVal FromOpera As Integer, ByVal FromNetscape As Integer, ByVal FromLotusNotes As Integer, ByVal FromEudora As Integer, ByVal FromPegasus As Integer) As Integer

Sub ReadMails()
    Dim txt As String
    Dim fileName As String
    Dim fileNum As Integer
    Dim counter As Integer
    ReDim Mails(0) As String
   
    txt$ = ""
    fileName = "MyMails.txt"
    fileNum% = FreeFile()
    counter% = 0
   
    GetMails fileName, 1, 1, 1, 1, 1, 1, 1, 1, 1
    Open fileName For Input As fileNum%
    Do While Not EOF(fileNum%)
        ReDim Preserve Mails(counter%) As String
        Line Input #fileNum%, txt$
        Mails(counter%) = txt$
        counter% = counter% + 1
    Loop
    Close fileNum%
   
    For n = 0 To counter - 1
        MsgBox Mails(n)
    Next

    Kill fileName
End Sub
Hat jemand eine Idee, wie ich die Sache ohne die Textdatei lösen könnte (also über PChar -> 1. Export der dll)? Wenn ich versuche die Funktion mit dem Pointer aufzurufen crasht mir jedenfalls VBA bzw. Lotus-Notes :? ...

neolithos 7. Okt 2003 10:29

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Code:
function CreateMails(byval dwFlags as long) as long
gibt ein Handle (intern ein Pointer) zurück auf den Delphi Buffer.
dwFlags kann man auch als Enumeration machen (interesse frag danach)

Code:
function CloseMails(byval dwHandle as long) as boolean
gibt speicher wieder frei

Code:
function CountMails(byval dwHandle as long) as integer
gibt anzahl zurück

Code:
function GetMail(byval dwHandle as long, byval sBuf as string, byval iLen as long) as long
holt eine Mail ab
sBuf speicher von zeichen z.B. String(1024, " ")
iLen länge des Buffer's 1024

Code:
dim hMails as long
dim iCount as long ' Anzahl der Mails
dim iLen as long ' Länge der zurückgegebenen Zeichengette
dim sBuf as string ' Buffer für Rückgabe der Mail
  hMails = CreateMails(MAIL_OUTLOOK or MAIL_OPERA)
  if hMails <> 0 then

     iCount = CountMails(hMails)
     for I = 0 to iCount - 1 
         sBuf = String(1024)
         iLen = GetMail(hMails, sBuf, 1024)
         ' beachte das du in Delphi mit StrCopy arbeitest, keine zuweisung ala :=
         if iLen > 0 then
            sBuf = Mid(sBuf, 1, iLen)
            ? sBuf
         end if
     next

     CloseMails(hMails)
  end if
ganz du dir darunter was vorstellen!

FriFra 7. Okt 2003 10:59

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Tut mir leid,aber was haben die Beispiele mit meiner dll oder deren Einbindung zu tun?

Ich will ganz einfach einen Null-Terminierten String übergeben.
Delphi Beispiel:
Delphi-Quellcode:
function GetMailsEx(Mails: PChar; KillDuplicates, RealNameEnabled,
  RealNameSimulated, FromOutlook, FromOpera, FromNetscape, FromLotusNotes,
  FromEudora, FromPegasus: boolean): boolean; stdcall; external
'B:\Projekte\Komponenten\LocalMail\dll\localmail.dll' name 'GetMails';

...

var
  Antwort: PChar;
begin
  Antwort := StrAlloc(MAX_RESULT);
  if GetMailsEx(Antwort, True, True, True, True, True, True, True, True, True)
    = True then
    ShowMessage(Antwort);
end;
Warscheilich habe ich Probleme, weil ich in VB keinen Speicher zugewiesen habe... aber wie geht das?

neolithos 7. Okt 2003 11:10

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Das Problem liegt doch im detail,
bei großen mail-mengen bräuchtest du doch einen großen Buffer.

Daher habe ich das ganze in kleine häppchen aufgespaltet.

Code:
dim Antwort as string
 Antwort := String(MAX_RESULT);
 if GetMailsEx(Antwort, 1, ...
geht zwar auch ist aber nicht gerade schön.

Würde ich z.B. als schnittstelle nicht akzeptieren.

FriFra 7. Okt 2003 11:21

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Zitat:

Zitat von neolithos
Das Problem liegt doch im detail,
bei großen mail-mengen bräuchtest du doch einen großen Buffer.

Daher habe ich das ganze in kleine häppchen aufgespaltet.

Code:
dim Antwort as string
 Antwort := String(MAX_RESULT);
 if GetMailsEx(Antwort, 1, ...
geht zwar auch ist aber nicht gerade schön.

Würde ich z.B. als schnittstelle nicht akzeptieren.

Kleine Häppchen brauche ich nicht, da die Funktion keine Mails, sondern lokal gespeicherte Mailadressen (Accounts, keine Adressbuchdaten) zurückliefert. Dafür sollte 4000 sehr grosszügig bemessen sein. Falls der übergebene Null-Terminierte String einmal länger ausfallen sollte, was sehr unwarscheinlich ist, werden die folgenden Adressen automatisch abgschnitten -> Der resultierende String kann niemals länger als 4000 sein.

Aber das hilft mir noch nicht, das ganze in VB einzubinden...

neolithos 7. Okt 2003 11:26

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Es steht zwar alles dar aber vielleicht fehlt dir das noch!

Code:
function GetMailsEx(byval Mails as String, byval KillDuplicates as long, ...

FriFra 7. Okt 2003 11:32

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Das habe ich schon längst gemacht...
Code:
Declare Function GetMails Lib "B:\Projekte\Komponenten\LocalMail\dll\localmail.dll" (ByVal Mails As String, ByVal KillDuplicates As Integer, ByVal RealNameEnabled As Integer, ByVal RealNameSimulated As Integer, ByVal FromOutlook As Integer, ByVal FromOpera As Integer, ByVal FromNetscape As Integer, ByVal FromLotusNotes As Integer, ByVal FromEudora As Integer, ByVal FromPegasus As Integer) As Integer
Allerdings führt der Aufruf, wie gesagt zu einer Schutzverletzung und zum kompletten Absturz, sowohl von VBA, als auch von Lotus Notes
Code:
GetMails Antwort, 1, 1, 1, 1, 1, 1, 1, 1, 1

neolithos 7. Okt 2003 11:33

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Ich hoffe du arbeitest intern mit StrCopy

FriFra 7. Okt 2003 11:38

Re: DLL Einbindung in VB, VBA bzw. Lotus-Script
 
Ich arbeite intern mit StrLCopy...
Delphi-Quellcode:
const
  MAX_RESULT = 4000;

...

function GetMails(Mails: PChar; KillDuplicates, RealNameEnabled,
  RealNameSimulated, FromOutlook, FromOpera, FromNetscape, FromLotusNotes,
  FromEudora, FromPegasus: boolean): Boolean; overload; export; stdcall;
var
  MyMailList: TFr_LocalMail;
begin
  MyMailList := nil;
  Result := False;
  try
    MyMailList := TFr_LocalMail.Create(nil);
    MyMailList.KillDuplicates := KillDuplicates;
    MyMailList.RealNameEnabled := RealNameEnabled;
    MyMailList.RealNameSimulated := RealNameSimulated;
    MyMailList.FromOutlook := FromOutlook;
    MyMailList.FromOpera := FromOpera;
    MyMailList.FromNetscape := FromNetscape;
    MyMailList.FromLotusNotes := FromLotusNotes;
    MyMailList.FromEudora := FromEudora;
    MyMailList.FromPegasus := FromPegasus;

    StrLCopy(Mails, PCHar(MyMailList.Mails.CommaText), MAX_RESULT);
    result := True;

  finally
    MyMailList.Free;
  end;
end;
Es macht aber keinen Unterschied, ob ich mit StrCopy oder StrLCopy arbeite... in beiden Fällen funktioniert der DLL Aufruf über ein Delphi-Program probemlos, aber VBA crasht :cry: ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz