Programmteile dynamisch laden

  • VB6

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von LaMa5.

    Programmteile dynamisch laden

    Hi!

    Ich muss u.U. ein VB6-Programm erweitern. Jedoch sollen die dadurch entstehenden Abhängigkeiten (Verweise) nicht unbedingt auf jedem Rechner erfüllt werden müssen (Deaktivieren der Funktion). Somit will ich einen bestimmten Verweis nur "laden", wenn das in ner Config auch so drin steht.

    Mein erster Ansatz dafür:
    Kann man ActiveX-DLLs bze. einzelne Funktionen in VB auch ohne Verweise einbinden?
    Hallo Andy!
    Also es gibs eine möglichkeit wenn du mit eine API rufst eine andere DLL oder eben mit Verweisen.
    Oder du erstellest eine Classe(DLL) imporiterst alle Verweise die du hast, und übergist die Werte in dein Programm.
    Mit die Classe kannst du komptte Programm ansteuern, bestimmte Funktionen aktivieren oder deaktivieren, ich finde das alle beste möglichkeit.
    Arbeite ich auch am einen Programm und da habe ich eine Classe geschrieben, mit die Classe kann ich bestimmte Funktionen Aktiv.-Deaktivieren oder nur eine Verweis laden, und das geht nur mit einzige DLL.

    Mfg Alex
    Ja Andy Queltext habe ich, aber das wird dir nicht weiter Helfen weil in meinen Klassen werden String, Booleanische Werte udn Dateien aus Ressoucen übergeben zum Teil sogear verschlüsselten Daten.
    Andy glauben kannst du was du willst, dann muß du so eine Klasse erstellen wo man Werte und Objeckte übergeben werden.
    Ich weis nicht was du da genau in dein Programm erweitern willst, ist auch egal, auf jedem Fall kannst denken was du willst, ich würde nicht lange rum da sitzen und träumen. Werde eine Klasse erstellen und in die Classe alle Verweise imporiteren, bestimmte Funktionen schreiben und in Form Code aufrufen so wie ich will und wo ich will.
    Was du brauchst nur eine einzige Classe (DLL), und die eine einzige Classe in dein Programm anbinden, dann kannst machen was du willst !

    Mfg Alex
    Ui.. ich merk grad, dass sich das Programm bei einem fehlendem Verweis (Datei) trotzdem starten lässt :whistling:
    Kann mir noch jemand sagen, wie man Feststellen kann, ob der Verweis erfüllt wird, ohne zu prüfen, ob die Datei existiert?

    Edit: hilft bei Plugins und sowas aber trotzdem nicht, weil zur Entwicklungszeit der Verweis gesetzt werden muss, reicht mir aber vorerst für das eine Problem. Gibts für Plugins oder sowas noch nen anderen Weg?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    Nö, jede Fehlermeldung kann mehrere beduteungen haben. Abgesehen davon ist die On Error Goto Schreibweise in VB6 nicht wirklich schön (kein Try).
    Viel brennender interessiert mich, wie man nur per API-Funktionen und Strings ne ActiveX-(/COM-)DLL verwendet. Unknown wär jetzt wieder mal passend - der weiß das API scheinbar auswendig :D
    Hi,

    Zitat aus einem ca. 4 Jahre Post von mir
    ...
    Allerdings habe ich in VB6 eine Möglichkeit programmiert in der man zur Laufzeit des Hauptprogramms zusätzliche Module integrieren kann.

    Gelöst habe ich das Problem mit Hilfe von ActiveX DLLs. Wobei jede DLL eine Modul/PlugIn darstellt. Alle DLLs müssen einen bestimmten Aufbau haben wie z.B.
    - es muss ein Klassenmodul mit Name xyz vorhanden sein
    - es muss eine Sub mit Namen zyx geben, die dann das eigentliche PlugIn startet.

    Jetzt noch ein bisschen Quelltext im Hauptprogramm, der die DLLs zur Laufzeit registriert und deregistriert und voila. ;)
    ...


    und hier der Code zum aufrufen

    Visual Basic-Quellcode

    1. Function openmodul(modName As String) As Object
    2. Dim i As Byte
    3. On Error Resume Next
    4. Do
    5. Set openmodul = CreateObject(modName & ".modul")
    6. If Err.Number <> 0 Then 'Fehlerbehandlung
    7. If Not RegisterFile(App.Path & "\" & modName & ".dll", True) Then
    8. 'MsgBox "Fehler bei Dateiregistrierung", vbCritical
    9. DllO.filllogbuch 1, "Error", "openmodul: Modul " & modName & _
    10. " konnte nicht registriert werden"
    11. Set openmodul = Nothing
    12. Err.Clear
    13. Exit Function
    14. End If
    15. Err.Clear
    16. Else
    17. Exit Do
    18. End If
    19. Loop Until i = 1
    20. End Function


    der nun folgende Teil stammt nicht von mir(!)

    Visual Basic-Quellcode

    1. 'Tools & Components für Visual-Basic 32-Bit
    2. 'ActiveX-Steuerelemente
    3. '
    4. 'wöchentliche Tipps & Tricks zu Visual-Basic
    5. 'Tipps & Tricks zu JavaScript / WEB-Design und Windows
    6. '
    7. 'zweiwöchentlich ercheinender Newsletter
    8. '
    9. 'Das alles finden Sie unter: http://www.tools4vb.de/
    10. '
    11. 'Dieter Otter
    12. 'Software-Entwicklung & Vertrieb
    13. 'eMail: info@tools4vb.de
    14. '======================================================
    15. Option Explicit
    16. 'Hier alle benötigten API-Funktionen
    17. Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    18. Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    19. Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    20. Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lParameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
    21. Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)
    22. Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    23. Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
    24. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    25. 'Die nachfolgende Funktion führt die Registrierung durch
    26. Public Function RegisterFile(ByVal sFile As String, Register As Boolean) As Boolean
    27. 'Der Parameter sFile enthält die zu registrierende Datei (inkl. Pfad)
    28. 'Register: True -> Datei soll registriert werden
    29. ' False -> Datei soll deregistriert werden
    30. Dim result As Boolean
    31. Dim Lib As Long
    32. Dim sProc As String
    33. Dim r1 As Long
    34. Dim r2 As Long
    35. Dim Thread As Long
    36. On Local Error GoTo RegError
    37. result = False
    38. Lib = LoadLibrary(sFile)
    39. If Lib Then
    40. sProc = IIf(Register, "DllRegisterServer", "DllUnregisterServer")
    41. r1 = GetProcAddress(Lib, sProc)
    42. If r1 Then
    43. Thread = CreateThread(ByVal 0, 0, ByVal r1, ByVal 0, 0, r2)
    44. If Thread Then
    45. r2 = WaitForSingleObject(Thread, 10000)
    46. If r2 Then
    47. 'Fehler aufgetreten
    48. FreeLibrary Lib
    49. r2 = GetExitCodeThread(Thread, r2)
    50. ExitThread r2
    51. Exit Function
    52. End If
    53. CloseHandle Thread
    54. 'OK
    55. result = True
    56. End If
    57. End If
    58. FreeLibrary Lib
    59. End If
    60. RegError:
    61. RegisterFile = result
    62. Exit Function
    63. End Function
    64. Public Function FileExists(ByVal sFile As String) As Boolean
    65. 'Der Parameter sFile enthält den zu prüfenden Dateinamen
    66. Dim Size As Long
    67. On Local Error Resume Next
    68. Size = FileLen(sFile)
    69. FileExists = (Err = 0)
    70. On Local Error GoTo 0
    71. End Function


    Hoffe das hilft Dir ein Stück weiter.


    bye ...

    LaMa5.
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de
    Hi,


    No Problem.


    bye ...

    LaMa5.
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de