Announcement

Collapse
No announcement yet.

Zweifel an DLL Wissen. VB-DLL in Delphi einbinden.

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

  • Zweifel an DLL Wissen. VB-DLL in Delphi einbinden.

    Hallo,
    leider bin ich stark am Zweifel, dass die DLL von jedem Programm heraus benutzt werden kann. Nach meinem Wissen oder was ich über die DLL verstanden habe sollte doch folgendes funktionieren:
    1. Wenn ich eine DLL schreibe (egal in Welche Sprache), kann ich aus anderen Programmen heraus benutzen.
    2. Ich kann jede DLL von den ich die Schnittstelle weiß (Funktion Namen) die auch benutzen.
    Nur Leider stimmt das nicht oder ich mache etwas Falsch?????

    Ich habe unter VB eine einfache DLL geschrieben die mit einer Funktion „addiere“ bestückt ist. Der nichts als die übergebenen Werte berechnet.
    Wenn ich die VB-Dll in Delphi benutzten will, passiert nichts, gar nichts. Warum wieso steht in den Sternen geschrieben?? Ich habe bis jetzt keinen Antwort auf meine frage bekommen!

    Oder über sehe ich irgendetwas? Wie z.B. das die DLL von VB nur unter VB-Programmen zu benutzbar sind.

    Kann mir bitte einen Tipp oder eine Lösungsvorschlag machen?

    Gruß + Danke
    M. Oda

  • #2
    Grundsätzlich dürft es gehen, jedoch mußt du einige Klippen umschiffen:

    - Beim Import von Funktionen aus DLL's wird Groß/Kleinschreibung unterschieden

    - Bei Verwendung von Strings als Parameter/Rückgabeparameter muß die richtige definition in Delphi erfolgen (evtl. PWideChar statt PChar/String)

    - Die Aufrufkonvention muß passen. Delphi verwendet im Normalfall die Aufrufkonvention Pascal. In VB kommt evtl. cdecl oder safecall oder Ähnliches zur Anwendun

    Comment


    • #3
      Nur Leider Funktioniert es nicht!

      Den dritten Punkt habe ich nicht so ganz verstanden,sorry?

      Ich stelle am besten den Code zur Verfügung:

      Die CODE von Delphi:
      <B>
      <BR>
      unit Unit1;
      <BR>
      interface
      <BR>
      uses<BR>
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<BR>
      Dialogs, StdCtrls;<BR>
      <BR>
      type<BR>
      TForm1 = class(TForm)<BR>
      Button1: TButton;<BR>
      procedure Button1Click(Sender: TObject);<BR>
      private<BR>
      { Private-Deklarationen }<BR>
      public<BR>
      { Public-Deklarationen }<BR>
      end;<BR>

      var<BR>
      Form1: TForm1;<BR>

      type<BR>
      TSummenFunktion = function(Z1,Z2: integer): integer;<BR>
      function addiere(zahl1, zahl2: integer): integer;<BR>
      <BR>
      implementation<BR>
      <BR>
      {$R *.DFM}<BR>
      <BR>
      function addiere(zahl1, zahl2: integer): integer;<BR>
      var SummenFunktion: TSummenFunktion;<BR>
      Handle: THandle;<BR>
      begin<BR>
      Handle:=LoadLibrary('ODA_test.dll');<BR>
      if Handle <> 0 then begin<BR>
      @SummenFunktion := GetProcAddress(Handle,'addieren');<BR>
      if @SummenFunktion <> nil then begin<BR>
      result:=SummenFunktion(zahl1, zahl2);<BR>
      ShowMessage(Inttostr(result));<BR>
      end;<BR>
      FreeLibrary(Handle);<BR>
      end;<BR>
      end;<BR>

      procedure TForm1.Button1Click(Sender: TObject);<BR>
      begin<BR>
      addiere(5,3);<BR>
      end;<BR>
      <BR>
      end.<BR>
      </B>

      und die im VB-DLL befindlicher CODE ist :

      <B>
      Public Function addieren(Z1, Z2 As Integer) As Integer<BR>
      addieren = Z1 + Z2<BR>
      End Function<BR>
      </B>

      Was kann man hier falsch machen ????????????

      Gruß + Dank

      Comment


      • #4
        TSummenFunktion = function(Z1,Z2: integer): integer; stdcall;<br>
        <br>Was ist stdcall?<br>
        Irgendwie muessen die Parameter an die Funktion uebergeben werden. Es gibt dazu drei Methoden<br>
        1. stdcall Der Aufrufer legt die Parameter auf den Stack und der Aufgerufenen raeumt sie am Ende ab. Das ist effizient, aber die Anzahl der Parameter ist festgelegt.<br>
        2. cdecl Der Aufrufer legt die Parameter auf den Stack ruft die Funktion und raeumt selbst auch wieder ab. Damit kann man variabel viele Parameter an eine Funktion uebergeben, aber das Abraeumen muss bei jedem Aufruf im Code stehen, waehrend es bei stdcall nur einmal beim Aufgerufenen steht.<br>
        3. register Ein Teil der Parameter wird in freien CPU-Registern uebergeben. Das ist sehr effizient, aber die Belegung ist von Programmiersprache zu Programmierspache unterschiedlich

        Comment


        • #5
          Hallo,

          &gt;..Ich habe unter VB eine einfache DLL geschrieben

          das geht meines Wissens nach gar nicht :-)

          Visual Basic konnte am Anfang überhaupt keine DLLs generieren. Ab der Version 3 (oder 4) hat Microsoft die Fähigkeit nachgerüstet, dass VB ein COM-Objekt als DLL verpacken kann. Das ist aber keine DLL im Sinne des API (daher schlägt der LoadLibrary/GetProcAddress-Weg auch fehl), sondern ein In-Process-Server, der nur auf dem Automation-Weg (COM-Weg) genutzt werden kann. Das eigene Delphi-Programm muss daher auf dem COM-Weg auf diesen in Form einer DLL vorliegenden In-Process-Server zugreifen.

          &gt;..und die im VB-DLL befindlicher CODE ist : <br>
          &gt;Public Function addieren(Z1, Z2 As Integer) As Integer

          Das ist <b>keine</b> exportierte Schnittstellenroutine der DLL, sondern "nur" eine <b>Interface-Methode</b> der COM-Schnittstelle des In-Process-Servers.

          Erst mit VB.NET entfällt diese Beschränkung, da VB.NET gegenüber C#, C++ und Delphi for .NET technisch gleichwertig ist

          Comment


          • #6
            Hallo Herr Kosch,
            man lernt jeden Tag etwas dazu!

            Das heißt doch, dass ich die VB-DLL nach Client Server Prinzip einbinden muss. Natürlich stellt sich für einen Leihen wie ich eins bin die Frage "Wie“?

            Ich habe über "Typbibliothek importieren" die VB-DLL eingebunden. Nur leider weiß ich nicht weiter und ich bin mir auch nicht 100% sicher, ob dies der richtige Weg ist.

            Ich würde mich auf den einen oder anderen Tipp freuen!

            Gruß + Danke
            M. Od

            Comment


            • #7
              Hallo,<BR>
              danke für alle Antworten. Ich habe das Rätsels Lösung, puhhh.<BR>
              <BR>
              Über „Typbibliothek importieren“ habe ich die DLL eingefügt. Mein <BR>Problem danach war die DLL-Unit in mein Programm einzubinden. Ich <BR>hatte folgendes versucht:<BR>
              <BR>
              <B>
              Unit MyProg;<BR>
              <BR>
              Uses …,ODA_test_TLB;<BR>
              <BR>
              type<BR>
              TForm1 = class(TForm)<BR>
              Button1: TButton;<BR>
              Edit1: TEdit;<BR>
              procedure Button1Click(Sender: TObject);<BR>
              private<BR>
              MyClass : Class1;<BR>
              { Private-Deklarationen }<BR>
              public<BR>
              { Public-Deklarationen }<BR>
              end; <BR>
              <BR>
              .<BR>
              .<BR>
              .<BR>
              procedure TForm1.Button1Click(Sender: TObject);<BR>
              var i,a,e:smallint;<BR>
              begin<BR>
              e:= MyClass.addieren(i,a);<BR>
              Edit1.Text := inttostr(e);<BR>
              end;<BR>
              <BR>
              </B>
              Und als den Programm ausgeführt habe, trat „Exception“ aus.<BR>
              <BR>
              Die Lösung ist:<BR>
              <BR>
              <B>
              Unit MyProg;<BR>
              <BR>
              Uses …,ODA_test_TLB;<BR>
              <BR>
              type<BR>
              TForm1 = class(TForm)<BR>
              Button1: TButton;<BR>
              Edit1: TEdit;<BR>
              procedure Button1Click(Sender: TObject);<BR>
              private<BR>
              { Private-Deklarationen }<BR>
              public<BR>
              { Public-Deklarationen }<BR>
              end; <BR>
              <BR>
              .<BR>
              .<BR>
              .<BR>
              procedure TForm1.Button1Click(Sender: TObject);<BR>
              var x : class1;<BR>
              i,a,e:smallint;<BR>
              begin<BR>
              x:=coclass1.create;<BR>
              i:= 4;<BR>
              a := 6;<BR>
              e:= x.addieren(i,a);<BR>
              Edit1.Text := inttostr(e);<BR>
              <BR>
              end;<BR>
              </B>
              <BR>
              <BR>
              Was dabei so lernen kann ;-)<BR>
              Die Frage steht noch, ob die Variante mit "Typenbibliothek <BR>importieren" die bessere Lösung ist?<BR>
              Anders gefragt, wie kann man es anders Lösen ?<BR>
              <BR>
              Gruß<BR>
              M.Oda<BR&gt

              Comment

              Working...
              X