DLL nur über absolute Pfadangabe erreichbar
Hallo
Ich programmiere grade ein Makro in VBA in Excel 2003.
Darin greife ich auf eine Hardware zu, die über eine DLL ansprechbar ist.
Mein Problem ist, dass ein Ansprechen der DLL Funktion über
Ein versuch mit einem
Mit andern dlls funktioniert es relativ, nur mit dieser nicht.
Registrieren kann ich die dll mit regsvr32 auch nicht. Hier bekomme ich nach der Eingabe von
Gibt es also eine Möglichkeit um eine absolute Pfadangabe herumzukommen?
miniversum
Ich programmiere grade ein Makro in VBA in Excel 2003.
Darin greife ich auf eine Hardware zu, die über eine DLL ansprechbar ist.
Mein Problem ist, dass ein Ansprechen der DLL Funktion über
Private Declare Function Funktionsname Lib "namederdll.DLL" (ByRef Version As Long) As Integer
nicht funktioniert. Hier bekomme ich immer die Fehlermeldung das er die Datei namederdll.DLL nicht finden kann. Benutze ich hingegen eine Absolute Pfadangabe funktioniert es:Private Declare Function Funktionsname Lib "C:\Pfadzurdll\namederdll.DLL" (ByRef Version As Long) As Integer
Ich würde es aber lieber relativ lassen.Ein versuch mit einem
Private Declare Function Funktionsname Lib ActiveWorkbook.Path & "namederdll.DLL" (ByRef Version As Long) As Integer
Schlug auch fehl. Hier bekomme ich die Fehlermeldung das nach dem Lib eine Zeichenfolge erwartet.Mit andern dlls funktioniert es relativ, nur mit dieser nicht.
Registrieren kann ich die dll mit regsvr32 auch nicht. Hier bekomme ich nach der Eingabe von
regsvr32 namederdll.dll
immer die Meldung "namederdll.dll wurde geladen, aber der DllRegisterServer-Eingangspunkt wurde nicht gefunden. Diese Datei kann nicht registriert werden.Gibt es also eine Möglichkeit um eine absolute Pfadangabe herumzukommen?
miniversum
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 83159
Url: https://administrator.de/contentid/83159
Ausgedruckt am: 21.11.2024 um 12:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo miniversum,
wenn Du legiglich den Namen der dll angibst, sprich ohne Pfadangabe, wird an folgenden Orten nach der dll gesucht:
Ansonsten kannst Du auch mittels der LoadLibrary Function Deine dll mit absoluter Pfadangabe selbst laden. Also "normal" deklarieren:
und bevor Du das erste mal eine Funktion Deiner dll aufrufst die LoadLibrary Funktion aufrufen:
Wenn Du dann keine dll-Aufrufe mehr tätigst, den aus der LoadLibrary Funktion zurückgebenden ModulHandle wieder freigeben:
BG, Felix -misterdemeanor-
wenn Du legiglich den Namen der dll angibst, sprich ohne Pfadangabe, wird an folgenden Orten nach der dll gesucht:
- Verzeichnis deiner XLS-File
- In dem Systemverzeichnis [Windowsverzeichnis]\System32
- Im [Windowsverzeichnis] (z.B. C:\Windows)
- An den in der PATH Umgebungsvariablen angegebenen Verzeichnissen.
Ansonsten kannst Du auch mittels der LoadLibrary Function Deine dll mit absoluter Pfadangabe selbst laden. Also "normal" deklarieren:
Private Declare Function Funktionsname1 Lib "namederdll.DLL" (ByRef Version As Long) As Integer
Private Declare Function Funktionsname2 Lib "namederdll.DLL" (ByRef Version As Long) As Integer
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
und bevor Du das erste mal eine Funktion Deiner dll aufrufst die LoadLibrary Funktion aufrufen:
Dim hndModule As Long
hndModule=LoadLibrary("C:\Pfadzurdll\namederdll.DLL")
FreeLibrary(hndModule)
BG, Felix -misterdemeanor-
Hallo miniversum,
Solltest Du auch gar nicht versuchen...es wird zwar nach bestimmten Dateiendungen gesucht...war aber auch blöd von mir bei obigen Beispiel diese wegzulassen
Also bei Verwendung von LoadLibrary sollte dann zumindest ein Fehler geworfen werden! Wenn Du LoadLibrary(".dll") verwendest musst Du dies vor dem ersten aufrufen einer gewünschten Funktion machen. Da keine Fehlermeldung kam (bis auf "kann Datei nicht finden") die wahrscheinlich bei dem Aufruf einer Funktion aus gewünschter dll kommt. Verbessere mich wenn die Fehlermeldung beim Aufruf von LoadLibrary kommt.
Den Tipp mit LoadLibrary gab ich Dir nur damit Du einen relativen Pfad verwenden kannst. Bsp:
s.o.
Am besten Du kopierst Deine dll´s einfach nach [Windowsverzeichnis]\System32
BG, Felix -misterdemeanor-
Das mit dem .dll weglassen hat nicht funktioniert.
Solltest Du auch gar nicht versuchen...es wird zwar nach bestimmten Dateiendungen gesucht...war aber auch blöd von mir bei obigen Beispiel diese wegzulassen
Zu früh gefreut. Mit der zweiten Dll (von gleichen hersteller) funktioniert beides nicht.
Also bei Verwendung von LoadLibrary sollte dann zumindest ein Fehler geworfen werden! Wenn Du LoadLibrary(".dll") verwendest musst Du dies vor dem ersten aufrufen einer gewünschten Funktion machen. Da keine Fehlermeldung kam (bis auf "kann Datei nicht finden") die wahrscheinlich bei dem Aufruf einer Funktion aus gewünschter dll kommt. Verbessere mich wenn die Fehlermeldung beim Aufruf von LoadLibrary kommt.
Nichtmal mit absolutem pfad. Ich bekomme immer die fehlermeldung das die dll nicht
gefunden werden kann. dabei liegt sie im richtigen Verzeichnis.
gefunden werden kann. dabei liegt sie im richtigen Verzeichnis.
Den Tipp mit LoadLibrary gab ich Dir nur damit Du einen relativen Pfad verwenden kannst. Bsp:
Private Sub Workbook_Open()
Dim sPathToDll2 As String
sPathToDll2 = Application.ActiveWorkbook.Path & "\Ressources\namederdll2.DLL"
'unbedingt aufrufen BEVOR Nutzung von "FunktionsnameAusDLL2"
LoadLibrary(sPathToDll2)
End Sub
Woran könnte das liegen?
s.o.
Am besten Du kopierst Deine dll´s einfach nach [Windowsverzeichnis]\System32
BG, Felix -misterdemeanor-
Hi miniversum,
...
Super________YIppIE!!!!!
Mein "Gedankengang" beim Lösungspost lässt sich vielleicht so ausdrücken: ?? 0
BG, Felix -misterdemeanor-
Ich habe das LoadLibrary schon vorher benutzt.
Funktioniert hatte es trotzdem nicht.
Funktioniert hatte es trotzdem nicht.
...
Irgendetwas mit es wird ein USB Hardteil verwendet und nun kam was neues; Treiber wurden installiert
Die Dll wird mit LoadLibrary gefunden und ich kann sie verwenden.
Super________YIppIE!!!!!
Mein "Gedankengang" beim Lösungspost lässt sich vielleicht so ausdrücken: ?? 0
BG, Felix -misterdemeanor-