Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Virtual Basic Dll in Delphi aufrufen? (https://www.delphipraxis.net/128529-virtual-basic-dll-delphi-aufrufen.html)

gandime 31. Jan 2009 16:47


Virtual Basic Dll in Delphi aufrufen?
 
Hi,
ich möchte in Delphi eine in VB geschriebene Dll aufrufen, welche ich so mache:
Delphi-Quellcode:
function TForm1.LoadDll(Name:PChar;Plugin:String):PChar;
type
  TDLLFunc = procedure;
var
  DLLHandle:THandle;
  Ret:PChar;
  func:TDllFunc;
begin
  Ret := '';
  DLLHandle:=LoadLibrary(PChar(ExtractFilePath(paramstr(0))+Plugin+'.dll'));
  if DLLHandle >= 32 then
  begin
    @func := GetProcAddress(DLLHandle,Name);
    if Assigned (func) then
      func;
  end;
  result:=Ret;
end;
So siehtz jetzt nur testweise die VB Dll aus:
Delphi-Quellcode:
Public Function start()
MsgBox "dll"
End Function
*
Public Sub start2()
MsgBox "dll"
End Sub
Was ist der Fehler?
Ich vermute den Fehler im VB-Code da ich Delphi Dll´s damit ohne Probleme laden kann!
Vlt kennt sich ja wer nen bissel mit VB aus und kann mir dabei helfen.

omata 31. Jan 2009 16:52

Re: Virtual Basic Dll in Delphi aufrufen?
 
Zitat:

Zitat von gandime
Was ist der Fehler?

Die Frage must du beantworten. Was geht denn nicht? Was ist der Fehler?

gandime 31. Jan 2009 16:55

Re: Virtual Basic Dll in Delphi aufrufen?
 
die funktion der VB Dll wird nicht geladen/ausgeführt
ups^^ hatte ich vergessen zu sagen

omata 31. Jan 2009 17:03

Re: Virtual Basic Dll in Delphi aufrufen?
 
Schau doch mal hier.

gandime 31. Jan 2009 17:45

Re: Virtual Basic Dll in Delphi aufrufen?
 
so die dll is jetzt verändert:
Delphi-Quellcode:
Public Function start() As String
MsgBox "dll"
start = "moin"
End Function
*
Public Sub start2()
MsgBox "pdll"
End Sub
*
Function DLLMain(ByVal a As Long, ByVal b As Long, ByVal c As Long) As Long
*** DLLMain = 1
End Function
*
Sub Main()
*** ' Dummy
End Sub

Und die Export.def:

LIBARY Project1
EXPORTS
*start
*start2
aber läuft immer noch nicht mit folgender Funktion:
Delphi-Quellcode:
function TForm1.GetPluginInfo (Name : PChar; Plugin : String) : PChar;
type
  TDLLFunc = function:String;
var
  DLLHandle:THandle;
  Ret:PChar;
  func:TDllFunc;
begin
  Ret := '';
  DLLHandle:=LoadLibrary(PChar(ExtractFilePath(paramstr(0))+Plugin+'.dll'));
  if DLLHandle >= 32 then
  begin
    @func := GetProcAddress(DLLHandle,Name);
    if Assigned (func) then// hier assigned(func)=false
      Ret:=pchar(func);
  end;
  result:=Ret;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(GetPluginInfo('start','a'));
end;
TDLLFunc = function:pchar; läuft auch nicht.

omata 31. Jan 2009 17:49

Re: Virtual Basic Dll in Delphi aufrufen?
 
Hast du die Funktionen die du benutzen möchtest auch exportiert?

gandime 31. Jan 2009 17:50

Re: Virtual Basic Dll in Delphi aufrufen?
 
angeblich hat er das gemacht:
Export.def:

LIBARY Project1
EXPORTS
start
start2

hatte gerade noch meinen oberen beitrag editiert

omata 31. Jan 2009 18:00

Re: Virtual Basic Dll in Delphi aufrufen?
 
Hast du das auch mal Schritt für Schritt über den Debugger analysiert? Welchen Wert hat DLLHandle? Und wo kommt da die 32 her? Sobald DLLHandle <> 0 ist, ist die Dll geladen.

gandime 31. Jan 2009 18:08

Re: Virtual Basic Dll in Delphi aufrufen?
 
DLLHandle=285212672 den wert 32 hatte ich hier im Forum gefunden.
Ich bin mir ja fast sicher das es an der VB Dll liegt.
Wärst du vlt so nett und würdest mir eine test Dll mit Source uppen?

omata 31. Jan 2009 18:13

Re: Virtual Basic Dll in Delphi aufrufen?
 
Mein angegebener Link enthält doch ein Beispiel Projekt

gandime 25. Mär 2009 18:02

Re: Virtual Basic Dll in Delphi aufrufen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
soo etwas zeit ist verstrichen und das Problem ist immer noch da... ich hab genau das Beispiel genommen und bekomme mit folgenden Code immer noch nix bei raus...
Delphi-Quellcode:
function TForm1.GetPluginInfo (Name : PChar; Plugin : String) : integer;
type
  TDLLFunc = function(a,b:double):double;
var
  DLLHandle:THandle;
  Ret:double;
  func:TDllFunc;
begin
  Ret:=0;
  DLLHandle:=LoadLibrary(PChar(ExtractFilePath(paramstr(0))+Plugin+'.dll'));
  if DLLHandle >= 32 then
  begin
    @func := GetProcAddress(DLLHandle,Name);
    if Assigned (func) then//Assigned (func)=false
      Ret:=((func(4,7)));
  end;
  result:=round(Ret);
end;
im anhang nochmal die Dll ich kann mir das nicht erklären warum das nicht geht!!!

Udo 27. Mär 2009 11:48

Re: Virtual Basic Dll in Delphi aufrufen?
 
Schon mal eine andere dll probiert?
Deine funktioniert jedenfalls nicht.

gandime 27. Mär 2009 14:04

Re: Virtual Basic Dll in Delphi aufrufen?
 
In Delphi erstellte DLL´s sind absolut kein Problem.... aber in VB...
Und nocheinmal was ich gemacht habe:
1. Ich habe VB 6
2. ich habe sowohl den Controller als auch die DLL aus genau diesem Beispiel ohne etwas zu ändern!
3. Ich Compiliere die beiden Projekte
4. Ich starte den Linker.exe und gebe in das Editfeld den Pfard der Export.def ein (die DLL liegt im selben Verzeichnis)
5. Drücke den Button
6. jetzt müsste die Dll ja egl funktionieren aber sie tut es nicht!!!

Könnte iwer eine funktionierende DLL hochladen, damit ich Delphi als Fehlerqualle ausschliesen kann?

craash 27. Mär 2009 14:10

Re: Virtual Basic Dll in Delphi aufrufen?
 
ich nehme mal an du meinst Visual Basic oder? :gruebel:

Luckie 27. Mär 2009 14:13

Re: Virtual Basic Dll in Delphi aufrufen?
 
Wird die Funktion immer noch nicht geladen? Was sagt denn MSDN-Library durchsuchenGetLastError, wenn MSDN-Library durchsuchenGetProcAddress 0 liefert? ansonsten sind mir zwei Sachen aufgefallen:
1. Du gibst keine Aufrufkonvention an und
2. die Funktion in der DLL gibt einen String zurück.

EWeiss 27. Mär 2009 15:27

Re: Virtual Basic Dll in Delphi aufrufen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

6. jetzt müsste die Dll ja egl funktionieren aber sie tut es nicht!!!
Sie tut es doch..
Die messagen würde ich grundsätzlich nicht als string zurückgeben das gibt ärger.
Wenn schon dann als Long oder Variant.

Warum das bei dir nicht geht ist einfach.
Du rufst eine MessageBox mit einem Pointer auf und erwartest gleichzeitig
eine rückgabe obwohl die Box noch nicht geschlossen wurde.

VB ist nicht multitask fähig so das du beides in einen schub abholen könntest.

Delphi-Quellcode:
Public Function start() As Variant
   
    start = MsgBox("dll")
    start = "Was ist das"
   
End Function
 
Public Sub start2()

    MsgBox "pdll"
   
End Sub
 
Function DLLMain(ByVal a As Long, ByVal b As Long, ByVal c As Long) As Long
   
    DLLMain = 1

End Function
 
Sub Main()
    ' Dummy
End Sub

Delphi-Quellcode:
Private Declare Function start Lib "TestDLL.DLL" () As Variant
Private Declare Sub start2 Lib "TestDLL.DLL" ()

Private Sub cmdExit_Click()
    End
End Sub

Private Sub Form_Load()
    lblResult(1).Caption = start
    start2

End Sub
Test DLL und Test Programm...

Anmerkung! Fehler die auftreten könnenFehlermeldungen beim Versuch, innerhalb der exportierten Funktionen Instanzen von Klassen zu erstellen
Probleme bei Funktionen, die als Parameter einen String erwarten oder diesen zurück geben (benutzen Sie statt dessen den Datentyp Variant)
Bei VB6 werden die Bibliotheken teilweise nicht gefunden (fügen Sie die Declare-Statements in ein Modul ein)

Anbei ein Example damit du siehst das es funktioniert.

gruss Emil

gandime 27. Mär 2009 17:28

Re: Virtual Basic Dll in Delphi aufrufen?
 
SOOO ein Fortschritt!
Das erste mal wurde die Funktion geladen!
dieses führt zwar in eine Fehlermeldung, was aber nicht mein jetziges Problem ist!
Zitat:

Erste Gelegenheit für Exception bei $76D342EB. Exception-Klasse EAccessViolation mit Meldung 'Access violation at address 660D8F5E in module 'MSVBVM60.DLL'. Read of address 00000076'. Prozess Project1.exe (2992)
Mein Problem besteht darin, das wenn ich deinen Source nocheinmal mit meinem Virtual Basic 6 compiliere funktioniert die DLL nicht mehr.
Die Funktion wird dann wiederum in Delphi nicht geladen!

Zitat:

(fügen Sie die Declare-Statements in ein Modul ein)
Liegt es vlt daran? da ich nicht weiss was du damit meinst!
Würdest du mir das mal bitte erklären wo ich was hinzufügen muss?

EWeiss 27. Mär 2009 18:56

Re: Virtual Basic Dll in Delphi aufrufen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

4. Ich starte den Linker.exe und gebe in das Editfeld den Pfard der Export.def ein (die DLL liegt im selben Verzeichnis)
5. Drücke den Button
6. jetzt müsste die Dll ja egl funktionieren aber sie tut es nicht!!!
Das ist schon mal verkehrt!
So kann die DLL nie funktionieren.

1. Die Originale Link.exe im pfad (VB98) nach Link1 umbenennen.
2. Das Archiv entpacken was ich angehängt habe.
3. Die Link.exe nach VB98 kopieren und die beigelegt DLL mit regserv32 Registrieren
4. VB6 starten und im Menü unter ADD-Ins/Add-Ins Manager den eintrag "Make DLL's in Visual Basic" auswählen.
dann die checkboxen "beim start laden" und "laden/Entladen" aktivieren.

5. Wenn du nun in VB6 die DLL Kompilierst geht ein Fenster auf mit der aufforderung ob du eine DLL erstellen willst.
Mit JA beantworten und dann die TestDLL.def auswählen.

Danach wird die DLL erstellt und sollte funktionieren.
Bedenke wenn du in der Environment bist mußt du die erstellte DLL im VB98 Pfad kopieren sonst wird sie nicht gefunden.
Als eigenständige Echsen reicht es wenn sie im APP Pfad liegt

Zitat:

(fügen Sie die Declare-Statements in ein Modul ein)
Die sind in einem Modul eingefügt (Modul = *.bas)
Dein Problem ist die richtigen Variablen zu finden die mit VB/Delphi zusammen arbeiten.. StrPtr, VarPtr, Variant..
oder was es sonst noch gibt.

gruss Emil

gandime 27. Mär 2009 19:29

Re: Virtual Basic Dll in Delphi aufrufen?
 
DANKE!!! für die ausführliche und wirklich gute Erklärung!!!

EWeiss 27. Mär 2009 19:33

Re: Virtual Basic Dll in Delphi aufrufen?
 
Zitat:

Zitat von gandime
DANKE!!! für die ausführliche und wirklich gute Erklärung!!!

gern geschehen ..

gruss Emil

gandime 28. Mär 2009 20:28

Re: Virtual Basic Dll in Delphi aufrufen?
 
Leider ist doch noch nicht alles erledigt...
blos jetzt bekomme ich immer noch den selben Fehler:
Zitat:

Erste Gelegenheit für Exception bei $763442EB. Exception-Klasse EAccessViolation mit Meldung 'Access violation at address 660D8F5E in module 'MSVBVM60.DLL'. Read of address 00000076'. Prozess Project1.exe (980)
auch wenn ich blos die procedure start2 im Beispeil lade!
muss ich vorher vlt. noch VB Dlls laden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 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