firewalker Δημοσ. 2 Ιανουαρίου 2006 Δημοσ. 2 Ιανουαρίου 2006 Όσοι ασχολούνται με προγραμματισμό σε 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
dg00 Δημοσ. 12 Ιανουαρίου 2006 Δημοσ. 12 Ιανουαρίου 2006 Μια απορια για αρχη .τι κανει ενα αρχειο dll;
random Δημοσ. 13 Ιανουαρίου 2006 Δημοσ. 13 Ιανουαρίου 2006 Ειναι ενα αρχείο - βιβλιοθήκη. Περιέχει κομμάτια κωδικα που χρησιμοποιούνται απο προγράμματα ( .EXE ας πουμε), αλλα για διάφορους λόγους δεν θελεις να τα ενσωματώσεις μεσα στο exe. 1. για να εχεις μικροτερο εκτελεσιμο 2. για να χρησιμοποιειται ο ιδιος κωδικας απο πολλα εκτελεσιμα 3. για να υπαρχει 1 φορά ο πολλαπλά χρησιμοποιουμενος κωδικας, αρα πιο ευκολες οι αλλαγες, και λιγοτερα λάθη. 4. για να χρησιμοποιησει αλλος τον εκτελέσιμο κωδικά σου, χωρις ομως να δει τον πηγαίο 5. για να κληθεί απο εκτελέσιμα απο άλλες γλωσσες. φτιάξε dll σε VB, και να ειναι χρήσιμο σε προγράμματα C, ή οτι άλλο.. Αυτη την περιπτωση αφορά το θεμα του firewalker. ... και αλλα πολλά. αν και δεν ασχολούμαι καθόλου με Βι-μπί, πολυ ενδιαφέρον.
- WHiSPER - Δημοσ. 27 Απριλίου 2006 Δημοσ. 27 Απριλίου 2006 Επειδη μου αρεσε αυτο το κολπο που βρηκες με τα 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
isim Δημοσ. 1 Μαΐου 2006 Δημοσ. 1 Μαΐου 2006 Καλα και γιατι δεν εκανες ενα COM object εξ'αρχης να τελειωνεις...Παντως δουλευει και ολο και καπου θα ειναι χρησιμο ευχαριστουμε
isim Δημοσ. 2 Μαΐου 2006 Δημοσ. 2 Μαΐου 2006 Epeidi i VB6 den exei COM Object.Tο actixeX exe καθως kai to activeX dll einai COM object. diabase to MSDN gia perissoteres plirofories
PavelX Δημοσ. 2 Μαΐου 2006 Δημοσ. 2 Μαΐου 2006 Dokimase tote na xrisimopoiiseis mia ActiveX DLL ftiagmeni me VB6 mesw VC++ kai pes mou poso eukolo itan
Heimdall Δημοσ. 4 Μαΐου 2006 Δημοσ. 4 Μαΐου 2006 Auti i methodos dinei enan diaforetiko aera stin VB... Excellent..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.