Προς το περιεχόμενο

Πως να δημιουργείτε standard Dlls σε VB 6


firewalker

Προτεινόμενες αναρτήσεις

Δημοσ.

Όσοι ασχολούνται με προγραμματισμό σε Visual Basic θα ξέρουν ότι η μεγαλύτερη αδυναμία της γλώσσας είναι τα αρχεία δυναμικής διασύνδεσης (.dll) που δεν μπορούν να δημιουργηθούν και να χρησιμοποιηθούν από εφαρμογές τόσο εύκολα όσο με άλλες γλώσσες προγραμματισμού (π.χ. C, C++ κ.τ.λ.). Αυτή είναι και η μεγαλύτερη κατηγορία που προσάπτουν στην εν λόγο γλώσσα προγραμματιστές που ασχολούνται με «βαριές» γλώσσες. Ψάχνοντας στο internet βρήκα κάτι που το αλλάζει αυτό.

 

Το πρώτο πράγμα που πρέπει να κάνουμε είναι να αλλάξουμε την διαδικασία που χρησιμοποιεί η vb για να κατασκευάσει ένα dll αρχείο.

Δημιουργούμε ένα standard EXE και από το μενού Project επιλέγουμε Remove Form1. στην συνέχεια από το ίδιο μενού επιλέγουμε Add Module και κάνουμε Paste τον κώδικα που ακολουθεί.

 

 

>
Public Sub Main()
  Dim SpecialLink As Boolean, fCPL As Boolean, fResource _
      As Boolean
  Dim intPos As Integer
  Dim strCmd As String
  Dim strPath As String
  Dim strFileContents As String
  Dim strDefFile As String, strResFile As String
  Dim oFS As New Scripting.FileSystemObject
  Dim fld As Folder
  Dim fil As File
  Dim ts As TextStream, tsDef As TextStream

  strCmd = Command
  
  Set ts = oFS.CreateTextFile(App.Path & "\lnklog.txt")
  
  ts.WriteLine "Beginning execution at " & Date & " " & _
      Time()
  ts.WriteBlankLines 1
  ts.WriteLine "Command line arguments to LINK call:"
  ts.WriteBlankLines 1
  ts.WriteLine "   " & strCmd
  ts.WriteBlankLines 2
  
  ' Determine if .DEF file exists
  '
  ' Extract path from first .obj argument
  intPos = InStr(1, strCmd, ".OBJ", vbTextCompare)
  strPath = Mid(strCmd, 2, intPos + 2)
  intPos = InStrRev(strPath, "\")
  strPath = Left(strPath, intPos - 1)
  ' Open folder
  Set fld = oFS.GetFolder(strPath)
  
  ' Get files in folder
  For Each fil In fld.Files
     If UCase(oFS.GetExtensionName(fil)) = "DEF" Then
        strDefFile = fil
        SpecialLink = True
     End If
     If UCase(oFS.GetExtensionName(fil)) = "RES" Then
        strResFile = fil
        fResource = True
     End If
     If SpecialLink And fResource Then Exit For
  Next
     
  ' Change command line arguments if flag set
  If SpecialLink Then
     ' Determine contents of .DEF file
     Set tsDef = oFS.OpenTextFile(strDefFile)
     strFileContents = tsDef.ReadAll
     If InStr(1, strFileContents, "CplApplet", _
         vbTextCompare) > 0 Then
        fCPL = True
     End If
     
     ' Add module definition before /DLL switch
     intPos = InStr(1, strCmd, "/DLL", vbTextCompare)
     If intPos > 0 Then
        strCmd = Left(strCmd, intPos - 1) & _
              " /DEF:" & Chr(34) & strDefFile & Chr(34) & _
                  " " & _
              Mid(strCmd, intPos)
     End If
     ' Include .RES file if one exists
     If fResource Then
        intPos = InStr(1, strCmd, "/ENTRY", vbTextCompare)
        strCmd = Left(strCmd, intPos - 1) & Chr(34) & _
            strResFile & _
                 Chr(34) & " " & Mid(strCmd, intPos)
     End If
     
     ' If Control Panel applet, change "DLL" extension to
     ' "CPL"
     If fCPL Then
        strCmd = Replace(strCmd, ".dll", ".cpl", 1, , _
            vbTextCompare)
     End If
     
     ' Write linker options to output file
     ts.WriteLine "Command line arguments after " & _
         "modification:"
     ts.WriteBlankLines 1
     ts.WriteLine "   " & strCmd
     ts.WriteBlankLines 2
  End If
  
  ts.WriteLine "Calling LINK.EXE linker"
  Shell "linklnk.exe " & strCmd
  If Err.Number <> 0 Then
     ts.WriteLine "Error in calling linker..."
     Err.Clear
  End If
  
  ts.WriteBlankLines 1
  ts.WriteLine "Returned from linker call"
  ts.Close
End Sub

 

Στην συνέχεια από το μενού Project επιλέγουμε References και «τικάρουμε» την επιλογή Microsoft Scripting Runtimes. Από το μενού File επιλέγουμε Make Project1.exe…

Το αρχείο που δημιουργείτε το μετονομάζουμε σε Link.exe , πηγαίνουμε στον φάκελο εγκατάστασης της vb (συνήθως C:\Program Files\Microsoft Visual Studio\VB98) εντοπίζουμε το αρχείο LINK.EXE που υπάρχει εκεί και το μετονομάζουμε σε LINKLNK.EXE στην συνέχεια στον ίδιο φάκελο τοποθετούμε το αρχείο Link.exe που φτιάξαμε προηγουμένως.

 

Τώρα θα κατασκευάσουμε ένα αρχείο dll.

 

Δημιουργούμε ένα ActiveX DLL και από το μενού Project επιλέγουμε Add Module και κάνουμε Paste τον κώδικα που ακολουθεί.

 

>
Option Explicit

Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3

Public Function DllMain(hInst As Long, fdwReason As Long, lpvReserved As Long) As Boolean
  Select Case fdwReason
     Case DLL_PROCESS_DETACH
        
     Case DLL_PROCESS_ATTACH
        DllMain = True
     Case DLL_THREAD_ATTACH
       
     Case DLL_THREAD_DETACH
        
  End Select
End Function

Public Function Fn_1(ByVal x As Integer) As Long
'To Fn_1 einai to onoma tis sinartisis kai mporei
'na einai otidipote 8eloume

   Fn_1 = 2 * x   'I sinartisi auti 8a epistrefei to diplasio tou ari8mou pou dinoume
   
End Function

Public Function Fn_2(ByVal y) As Long

   Fn_2 = Len(y)  'I sinartisi auti 8a epistrefei ton ari8mo twn xaraktirwn enos String
   
End Function

 

Σώζουμε το Project όνομα TestLib (μπορεί να είναι ότι θέλουμε). Στην συνέχεια στον φάκελο που έχουμε σώσει το project δημιουργούμε ένα αρχείο με το ίδιο όνομα και επέκταση def (στην περίπτωση μας TestLib.def). Το αρχείο αυτό πρέπει να περιέχει τον παρακάτω κώδικα.

 

NAME TestLib

LIBRARY Test

DESCRIPTION "Test Library in vb 6"

EXPORTS DllMain @1

Fn_1 @2

Fn_2 @3

 

Το αρχείο TestLib.def λέει στον linker (Link.exe) για το σημείο εισόδου του DllMain (main entry point DllMain) και για τις συναρτήσεις που περιέχει η βιβλιοθήκη μας (στην περίπτωση μας τις Fn_1 και Fn_2). Είχαμε και μια τρίτη συνάρτηση Fn_3 τότε στο αρχείο TestLib.def θα υπήρχε και η γραμμή Fn_3 @4.

 

Το όνομα των συναρτήσεων πρέπει να είναι γραμμένο σωστά. Διαφορετικά το dll δεν θα είναι λειτουργικό.

 

Από το μενού File επιλέγουμε TestLib.dll …

 

Ας φτιάξουμε τώρα μία εφαρμογή που θα καλεί τις συναρτήσεις από την βιβλιοθήκη που μόλις κατασκευάσαμε.

 

Επιλέγουμε Standard EXE. Στην φόρμα τοποθετούμε δύο text boxes, δυο Labels και ένα Command Button. Στην συνέχεια τοποθετούμε τον παρακάτω κώδικα.

 

>
Option Explicit

Private Declare Function Fn_1 Lib "TestLib.dll" (ByVal x As Integer) As Long

Private Declare Function Fn_2 Lib "TestLib.dll" (ByVal y) As Integer

Private Sub Command1_Click()

   Label1.Caption = Fn_1(Text1.Text)  

   Label2.Caption = Fn_2(Text2.Text)  

End Sub

Stadard_Dll_in_VB6.zip

  • 2 εβδομάδες αργότερα...
Δημοσ.

Ειναι ενα αρχείο - βιβλιοθήκη. Περιέχει κομμάτια κωδικα που χρησιμοποιούνται απο προγράμματα ( .EXE ας πουμε), αλλα για διάφορους λόγους δεν θελεις να τα ενσωματώσεις μεσα στο exe.

1. για να εχεις μικροτερο εκτελεσιμο

2. για να χρησιμοποιειται ο ιδιος κωδικας απο πολλα εκτελεσιμα

3. για να υπαρχει 1 φορά ο πολλαπλά χρησιμοποιουμενος κωδικας, αρα πιο ευκολες οι αλλαγες, και λιγοτερα λάθη.

4. για να χρησιμοποιησει αλλος τον εκτελέσιμο κωδικά σου, χωρις ομως να δει τον πηγαίο

5. για να κληθεί απο εκτελέσιμα απο άλλες γλωσσες. φτιάξε dll σε VB, και να ειναι χρήσιμο σε προγράμματα C, ή οτι άλλο..

Αυτη την περιπτωση αφορά το θεμα του firewalker.

 

... και αλλα πολλά. αν και δεν ασχολούμαι καθόλου με Βι-μπί, πολυ ενδιαφέρον.

  • 3 μήνες μετά...
Δημοσ.

Επειδη μου αρεσε αυτο το κολπο που βρηκες με τα dlls αποφασισα να διευκολυνω την κατασταση με τα αρχεια def. Το project που εφτιαξα μπορει να εισαγει στο αρχειο def ολες τις δημοσιες procedures (μόνο) απο το module που περιεχει το entry point.

Απαραιτητη προϋποθεση για να λειτουργησει το προγραμμα αυτο ειναι να εχει αποθηκευτει το project.

 

Επειδη μονο ο δημιουργος ξερει τα περιεχόμενα του dll που εχει φτιαξει και επειδη μερικες φορες λογω του πληθους των procedures δεν ειναι ευκολη η δημιουργια ενος module με τις declarations του dll ωστε να μπορει να χρησιμοποιηθει απο αλλους, το project μπορει να δημιουργησει το module αυτο. Ωστοσο καλυπτει μονο τις Declare Sub... & Declare Function... [επειδη δεν εχω χρονο λογω εξετασεων]. Ωστοσο, ακομη και αν καποιος τριτος γνωριζει τις procedures δεν μπορει να χρησιμοποιησει το dll αν αυτο περιεχει Types, Enums και Constants (Βεβαια βαζοντας σε ενα Class Module (Public η Global) τα Types, Enums και Constants και προσθετοντας τη αντιστοιχη Reference στο νεο μας project το προβλημα λυνεται). Σκοπος ειναι να δημιουργηθει ενα dll σαν αυτα των Windows (shell32, user32, ...)

 

Το καλοκαιρι θα φροντησω να τελιωσω το project και θα το ανεβαω στο internet

Αν καποιος ασχοληθει και τελιωσει πριν απο μενα θα του ειμαι ευγνωμων αν δημοσιευσει τον κωδικα.

 

Στο συνημενο υπαρχει ο πηγαιος κωδικας

Make .def files.zip

Δημοσ.

Καλα και γιατι δεν εκανες ενα COM object εξ'αρχης να τελειωνεις...Παντως δουλευει και ολο και καπου θα ειναι χρησιμο ευχαριστουμε :-)

Δημοσ.
Epeidi i VB6 den exei COM Object.
Tο actixeX exe καθως kai to activeX dll einai COM object. diabase to MSDN gia perissoteres plirofories

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...