windows - Sådan bruger du DLL'er i samme mappe som en Excel-fil

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er noget relateret til mit andet spørgsmål.


Jeg har brugt en dll til at medvirke til et Excel-regneark. Alt, der arbejder i øjeblikket med dll og Excel, bruger det fint. Men er det muligt at angive, at en dll befinder sig i samme mappe som Excel-filen, når de erklærer funktioner?


Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)


Uheldigvis virker dette ikke, jeg skal bruge noget som:


Declare Sub FortranCall Lib "C:	empFcall.dll" (r1 As Long, ByVal num As String)


Dette virker, men det vil forårsage hovedpine, når de distribueres til mine kontormater. Placering af dll i c: \ windows \ system32 osv. Er heller ikke en mulighed.

Bedste reference


Her er tre muligheder for dynamisk indlæsning/opkald til DLL'er fra VBA, herunder links til relevant info og nogle prøvekode. Kan ikke sige, at jeg nogensinde har brug for nogen af ​​de løsninger, der er beskrevet der, men det ser ud som en rimelig udforskning af mulighederne i lyset af VBAs behov for en statisk vej. [10]



  1. Opret et nyt modul ved kørsel (du kunne importere en .bas-fil fra disken, du behøver ikke at kode kode modulet med strengbogstaver) ved hjælp af VBIDE Extensibility API. Ulempe: ingen kompileringstid validering; du skal bruge stringly-typede Application.Run opkald for at påberåbe det. Kræver tillid til programmeret adgang til VBIDE API'en (dvs. du tillader VBA at udføre kode, der genererer kode, der derefter udføres ... som makrovirus gør) .

  2. Brug LoadLibrary Win32 API ... og nu har du fået pointers og adresser: Denne skræmmende kode (.zip download) er i det væsentlige et enormt umuligt hack, der bruger samlingssprog til at aktivere API-funktionerne ved at navn. Det ser ud til, at det kun fungerer for en delmængde af understøttede Win32 API-funktioner selv.

  3. Skift DLL-søgevej, men så også kræver dynamisk kode tilføjet i løbetid, så det kan lige så godt gå med ovenstående.



Her er en anden potentiel løsning, der foreslår programmatisk opdatering af PATH-miljøvariablen, før du ringer til din DLL. Det er ikke en dårlig ide, hvis det virker, som du kunne tilføje dette til din arbejdsbogens åbne begivenhed. [11] [12]]]


Held og lykke!

Andre referencer 1


Den måde jeg generelt tager mig af dette er ved at tilføje:


Dim CurrentPath As String
CurrentPath = CurDir()   
ChDir (ThisWorkbook.Path)


Til: Privat Sub Workbook\_Open ()

Andre referencer 2


ChDir () skal gøre tricket. Det fungerer muligvis ikke på netværksmapper.


Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)
...
Dim CurrentPath As String
CurrentPath = CurDir()   
ChDir (ThisWorkbook.Path)
Call FortranCall(r, n)
ChDir (CurrentPath) ' Change back to original directory


Hold nu .dll i samme mappe som din projektmappe.

Andre referencer 3


Du kan sætte DLL'en i nogle mapper og tilføje den til stien EnVar.

Andre referencer 4


ActiveWorkbook.Path giver dig den fulde sti til mappen med den aktuelt aktive projektmappe. Så prøv det her:


Declare Sub FortranCall Lib ActiveWorkbook.Path & "Fcall.dll" (r1 As Long, ByVal num As String)