.dll einbinden ohne registrierung bei Windows

  • Word

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    .dll einbinden ohne registrierung bei Windows

    Hi zusammen,

    ich habe zwar ein wenig Grundkenntnisse von VBA für Excel, aber das hier ist mir ein wenig zu hoch und hoffe nun dass ihr mir ein wenig helfen könnnt :)

    Ich benötige um unsere Archivierung auf Arbeit zu beschleunigen ein Makro was Barcodes in Doc-Textdateien auslesen kann.
    Ich habe dafür ein fertiges Makro für Word im Netz gefunden was an sich auch funktioniert.

    Im Anhang füg ich die original Word Datei und die .dll mal hinzu.

    Hier der Code:

    <Code Anfang>
    Option Explicit

    Public Enum BarcodeType
    None = 0 ' Not specified
    Code39 = 1 ' Code39
    EAN = 2 ' EAN/UPC
    Code128 = 4 ' Code128
    All = 7 ' All: Code39 Or EAN Or Code128
    End Enum

    Private Sub readBarcode()
    Dim oBarcodeDetection As Object
    Dim oInlineShape As InlineShape
    Dim sBarcodes As String, sAllBarcodes As String

    On Error GoTo errHandler
    Set oBarcodeDetection = CreateObject("BarcodeDetection")
    For Each oInlineShape In ActiveDocument.InlineShapes
    If oInlineShape.Type = wdInlineShapePicture Then
    oInlineShape.Select
    Selection.CopyAsPicture
    sBarcodes = oBarcodeDetection.FullScanPage(oBarcodeDetection.GetImageFromClipboard(), 100, BarcodeType.All, True)
    If LenB(sBarcodes) > 0 Then
    If LenB(sAllBarcodes) > 0 Then sAllBarcodes = sAllBarcodes & "|"
    sAllBarcodes = sAllBarcodes & sBarcodes
    End If
    End If
    Next
    Selection.EndKey wdStory
    ClearClipBoard
    If LenB(sAllBarcodes) = 0 Then
    MsgBox "Did not detect any barcodes"
    Else
    MsgBox "Detected barcodes: " & sAllBarcodes
    End If
    Exit Sub
    errHandler:
    MsgBox Err.Description
    Resume Next
    End Sub

    Private Sub ClearClipBoard()
    On Error Resume Next
    Dim oData As New MSForms.DataObject
    oData.SetText Text:=Empty
    oData.PutInClipboard
    End Sub
    <Code Ende>

    Mein Problem ist jetzt dass das Programm nur funktioniert wenn ich die .dll (nennt sich BarcodeScanner.dll bzw. war dazu eine 2. .dll Datei names BarcodeImaging.dll) in Windows registriere.
    Da ich auf Arbeit allerdings keine Admin Rechte besitze habe ich mir gedacht dass ich die .dll an einen zentralen Ort ablegen (sagen wir O:\BarcodeReader\) und dem Macro bei jeder Ausführung sage dass er diese von dort ausführen soll.

    Funktioniert meine Idee so überhaupt? Und wenn ja wie müsste ich den Code oben anpassen?

    Tausend dank im Voraus :)
    Dateien
    • BarcodeImaging.dll

      (32,77 kB, 110 mal heruntergeladen, zuletzt: )
    • BarcodeScanner.dll

      (26,11 kB, 125 mal heruntergeladen, zuletzt: )
    • COMTest.doc

      (63,49 kB, 128 mal heruntergeladen, zuletzt: )
    Füg doch bitte erst einmal den Code richtig formatiert ein. Das kann ja kein Mensch lesen.

    Edit:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Enum BarcodeType
    3. None = 0 ' Not specified
    4. Code39 = 1 ' Code39
    5. EAN = 2 ' EAN/UPC
    6. Code128 = 4 ' Code128
    7. All = 7 ' All: Code39 Or EAN Or Code128
    8. End Enum
    9. Private Sub readBarcode()
    10. Dim oBarcodeDetection As Object
    11. Dim oInlineShape As InlineShape
    12. Dim sBarcodes As String
    13. Dim sAllBarcodes As String
    14. On Error GoTo errHandler
    15. Set oBarcodeDetection = CreateObject("BarcodeDetection")
    16. For Each oInlineShape In ActiveDocument.InlineShapes
    17. If oInlineShape.Type = wdInlineShapePicture Then
    18. oInlineShape.Select
    19. Selection.CopyAsPicture
    20. sBarcodes = oBarcodeDetection.FullScanPage(oBarcodeDetection.GetImageFromClipboard(), 100, BarcodeType.All, True)
    21. If LenB(sBarcodes) > 0 Then
    22. If LenB(sAllBarcodes) > 0 Then sAllBarcodes = sAllBarcodes & "|"
    23. sAllBarcodes = sAllBarcodes & sBarcodes
    24. End If
    25. End If
    26. Next
    27. Selection.EndKey wdStory
    28. ClearClipBoard
    29. If LenB(sAllBarcodes) = 0 Then
    30. MsgBox "Did not detect any barcodes"
    31. Else
    32. MsgBox "Detected barcodes: " & sAllBarcodes
    33. End If
    34. Exit Sub
    35. errHandler:
    36. MsgBox Err.Description
    37. Resume Next
    38. End Sub
    39. Private Sub ClearClipBoard()
    40. On Error Resume Next
    41. Dim oData As New MSForms.DataObject
    42. oData.SetText Text:=Empty
    43. oData.PutInClipboard
    44. End Sub
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Radinator“ ()

    Martin1337 schrieb:

    Set oBarcodeDetection = CreateObject("BarcodeDetection")
    bedeutet, dass er eine registrierte DLL suchen soll.

    Versuch mal, in den References die unregistrierte DLL einzutragen und dann eine Instanz daraus zu erstellen

    Visual Basic-Quellcode

    1. ​Set oBarcodeDetection = New BarcodeDetection
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi zusammen,

    also wenn ich in den references die DLL eintrage, kommt die Fehlermeldung "Verweis auf angegebene Datei kann nicht hinzugefügt werden."
    Gibt es denn generell überhaupt eine Möglichkeit .dll's einzubinden ohne diese bei windows registrieren zu müssen, denn wie bereits geschrieben habe ich auf Arbeit keine Adminrechte und kann dies somit nicht machen.

    Eine externe abfrage der DLL von einem lokalen Verzeichnis wäre daher optimal.

    @Radinator

    Danke fürs Editieren des Codes. Mein Browser hat das irgendwie nicht so gemacht wie ichs wollte.

    Gruß Martin
    Wenn du die Signatur der aufzurufenden Prozeduren genau kennst, kannst du versuchen, mit Declare die Funktionen zu definieren.
    Bei Lib kannst du auch einen vollen Pfadnamen der DLL verwenden.
    msdn.microsoft.com/en-us/library/aa716201(v=vs.60).aspx

    Ich habe es auf diese Art noch nie versucht.
    Gib Bescheid, ob's funktioniert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --