AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL Einbindung in VB, VBA bzw. Lotus-Script
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Einbindung in VB, VBA bzw. Lotus-Script

Ein Thema von FriFra · begonnen am 7. Okt 2003 · letzter Beitrag vom 7. Okt 2003
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

DLL Einbindung in VB, VBA bzw. Lotus-Script

  Alt 7. Okt 2003, 10:03
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 ...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

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

  Alt 7. Okt 2003, 10:29
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!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#3

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

  Alt 7. Okt 2003, 10:59
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.dllname '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?
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

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

  Alt 7. Okt 2003, 11:10
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#5

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

  Alt 7. Okt 2003, 11:21
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...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

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

  Alt 7. Okt 2003, 11:26
Es steht zwar alles dar aber vielleicht fehlt dir das noch!

Code:
function GetMailsEx(byval Mails as String, byval KillDuplicates as long, ...
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#7

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

  Alt 7. Okt 2003, 11:32
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
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

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

  Alt 7. Okt 2003, 11:33
Ich hoffe du arbeitest intern mit StrCopy
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#9

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

  Alt 7. Okt 2003, 11:38
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 ...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 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