Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0458: Existiert eine Funktion in einer DLL

 von 

Beschreibung 

Mit diesem Code wird überprüft, ob eine Funktion von einer DLL exportiert wird. Hiermit kann man z.B. sehr elegant testen, ob ein bestimmtest Feature vom Betriebssystem unterstützt wird, ohne herausfinden zu müssen, welches Betriebssystem genau verwandt wird. Dieser Tipp findet beispielsweise gut unter Windows2000 bei transparenten Fenstern Verwendung, da man nur testen muss, ob die Api SetLayeredWindowAttributes existiert.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

FreeLibrary, GetModuleHandleA (GetModuleHandle), GetProcAddress, LoadLibraryA (LoadLibrary)

Download:

Download des Beispielprojektes [2,16 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'-------- Anfang Projektdatei IsFunctionExported.vbp --------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Textfeld "Text2"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"
Option Explicit

Private Declare Function GetModuleHandle Lib "kernel32" _
                         Alias "GetModuleHandleA" ( _
                         ByVal lpModuleName As String) As Long
                         
Private Declare Function LoadLibrary Lib "kernel32" _
                         Alias "LoadLibraryA" ( _
                         ByVal lpLibFileName As String) As Long
                         
Private Declare Function GetProcAddress Lib "kernel32" ( _
                         ByVal hModule As Long, _
                         ByVal lpProcName As String) As Long
                         
Private Declare Function FreeLibrary Lib "kernel32" ( _
                         ByVal hLibModule As Long) As Long
                         
Private Sub Command1_Click()
    If IsFunctionExported(Text2.Text, Text1.Text) Then
        MsgBox ":)" & vbCrLf & "Die Funktion wird von der DLL unterstützt!"
    Else
        MsgBox ":(" & vbCrLf & "Diese Funktion wird von der DLL leider nicht unterstützt!"
    End If
End Sub

' Diese Funktion überprüft, ob die angegebene Function von einer DLL exportiert wird.
Private Function IsFunctionExported(ByVal sFunction As String, ByVal sModule As String) _
    As Boolean
    
    Dim hMod As Long, Loaded As Boolean
    
    ' Handle der DLL erhalten
    hMod = GetModuleHandle(sModule)
    
    If hMod = 0 Then ' Falls DLL nicht registriert ...
        hMod = LoadLibrary(sModule) ' DLL in den Speicher laden.
        If hMod Then Loaded = True
    End If
    
    If hMod Then
        If GetProcAddress(hMod, sFunction) Then IsFunctionExported = True
    End If
    
    If Loaded Then Call FreeLibrary(hMod)
End Function

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Ende Projektdatei IsFunctionExported.vbp ---------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von XETH am 24.07.2004 um 22:04

"@Volkmar: Das geht bei COM-DLLs, wie sie von VB erstellt wrerden, nicht, weil dort die Funktionen anders exportiert werden. Du müsstest mit mit bestimmten COM-Schnittstellen die DLL auslesen können, aber Genaueres weiß ich leider auch nicht."

ich habe eine vb exe (mit source) weiteretnwickelt mit komfortablem menü da schreibt man die funktionen rein die man exportieren will aus seiner activeX dll.

dann wird der linker aufgerufen und erstellt mit den veränderten informationen eine nicht-activeX dll.

funzt wunderbar habe es schon ausprobiert

wer interesse hat soll mir mailen

Kommentar von MVXA am 27.06.2004 um 10:40

Hallo

DLLs die mit VB erstellt werden können NICHT mit dieser Funktion überprüft werden. Das liegt einfach daran das die DLLs, die von VB erstellt werden, ActiveX DLLs sind. Um alle Funktionen in einer ActiveX DLL auflisten zu können gibt es von www.VBAccelerator.com ein Programm ( in VB geschrieben ) das alle Informationen auflistet.
http://vbaccelerator.com/article.asp?id=1428

Kommentar von Silvio Peters am 05.02.2004 um 23:12

Sorry

Mein Mausrad hat hat geklemmt ;).
Hab gerade die Notizen unten gelesen, schade eigendlich.

Silvio

Kommentar von Silvio Peters am 05.02.2004 um 23:07

Hallo

Hab mal eine Frage.

Funktioniert das auch bei DLLs die man selbst mit VB erstellt hat? Ich habe es ausprobiert und obwohl die DLL die angegebene Funktion unterstützt und auch am angegebenen Pfad steht, sagt das Programm "wird nicht unterstützt".
Die DLL ist auch registriert. Groß/Kleinschreibung des Funktionsnamens hab ich beachtet.

BS: Win2000 SP4,
VB6 SP5

Wär nett mir jemand mal kurz helfen könnte, die Funktion würde mir echt helfen ein kleines Versionierungsproblem zu lösen ;) .

Danke im voraus
Silvio

Kommentar von Philipp Stephani am 18.06.2003 um 21:02

sorry, Name vergessen #)

Kommentar von am 18.06.2003 um 20:57

@Volkmar: Das geht bei COM-DLLs, wie sie von VB erstellt wrerden, nicht, weil dort die Funktionen anders exportiert werden. Du müsstest mit mit bestimmten COM-Schnittstellen die DLL auslesen können, aber Genaueres weiß ich leider auch nicht.

Kommentar von Volkmar am 06.11.2002 um 11:06

Wie muß ich GetProcAdress anwenden, wenn ich eine selbsgeschrieben VB-DLL verwende???
Auf die vier Funktionen
"DllCanUnloadNow"
"DllGetClassObject"
"DllRegisterServer"
"DllUnregisterServer"
,die automatisch zur VB-DLL hinzugefügt werden, funktioniert das ganze!!!!!!