Hej Hej! Oj! det lät jobbigt... Tack för förra svaret! All logik för att registrera en COM dll är förpackat i aktuell dll. Det är bara ett anrop in i den som kräns. T.ex, med hjälp av regsvr32. Givetvis kan du göra detta automatiskt med package and deployment wizard samt andra installationsprogram. Ok, Tack för din hjälp!Att anropa en dll
Jag ska få en dll från en som kan C++ men inte vb… och själv har jag aldrig använt mig av dll:er. Undrar därför hur jag lämpligast skriver ett anrop till denna. Dll:en innehåller ett butterworth-filter som ska filtrera en längsprofil. Nåja… jag läser in längdprofilen i en array, och behöver förutom denna också ange en filtreringslängd.
Alltså ska följande två variabler ”skickas” till dll:en
Dim dblMinArray(2000000) as Double
Dim lngLängd as Long
Och ut vill jag ha den filtrerade profilen i en array
Kan någon tipsa mig med en lämplig kod-snutt för detta!?
-----------------------------------------------------------------
Fråga2: Om jag sen ska köra programmet på en annan dator, måste jag då registrera dll:en eller räcker det att den ligger i samma mapp?? Eller kan man gå runt detta genom att bädda in DLL:en i programmet... med programet Fusion från Bit-Arts...?
Tack på förhand! /BSv: Att anropa en dll
En lösning på problemet är att be honom göra en C++ COM-komponent som innehåller den logik du vill använda. Denna kan du instansiera från VB genom:
<code>
' init stuff...
dim ref as component.class
set ref = createobject("component.class")
ret = ref.DotheMagicStuff(data,moredata)
set ref = nothing
' Take care of the returned data...
</code>
Detta bygger på att du registrerat hans dll med t.ex. regsvr32 (regsvr32 thedll.dll). Tänk på att datatyper skiljer mellan VB och C++. Särskilt vad gäller arrayer, strängar odyl. Be C++ killen att ta emot och returnera typer som VB kan hantera.
När du skall köra en COM komponent måste denna vara registrerad en instansiering innebär att SCM letar efter aktuellt progid ("component.class") under hkey_classes_root och hittar aktuell CLSID. Med hjälp av detta id kan SCM hitta var dlln finns (Under CLSID i reg). Denna laddas in i klientprocessen eller i en hostcontainer (MTS/COM+). Du måste oxo ha tillgång till det interfaceid (IID) som du vill använda för kommunikationen (om du inte använder late binding (IDispatch)). Detta är den referenstyp (pekartyp) du vill ha för kommunikation med aktuellt objekt.
Om du vill aktivera denna på en annan maskin kan du lösa det på fler sätt. Ett är att regga hans klass eller en proxy (Så att du får tillgång till IID genom typlib) på din maskin och sedan använda dcomcnfg för att styra över anropet till en annan dator via DCOM. Ett annat alternativ är att registrera komponenten i COM+/MTS och låta denna miljö sköta om remoteaktiveringen.Sv: Att anropa en dll
trodde att man kunde anropa den som en funktion ungefär...
:-/Sv: Att anropa en dll
Men det här med registreringen, kan man inte få den fixad vid installationen av sitt vb-program, alltså när man kör setup-filen?? Jag har hittills använt ”Package and Deployment Wizard” i vb, denna tar ju med alla nödvändiga dll:er osv.
Det måste nämligen vara lätt för slutanvändaren att använda… Sv: Att anropa en dll
Sv: Att anropa en dll
undrar dock angående koden
<code>
' init stuff...
dim ref as component.class
set ref = createobject("component.class")
ret = ref.DotheMagicStuff(data,moredata)
set ref = nothing
' Take care of the returned data...
</code>
kan "ret" (som står för returvärdet eller?) vara en array? om jag gör om lite till mina behov så blir det så här, kan det funka? vad är "DotheMagicStuff" och "component.class"? var anges dll namn och sökväg?
<code>
'IN till dll
Dim HighPf as double 'filtering wavelength (kan vara decimaltal)
Dim LowPf as double 'low bandpass filter wavelength
Dim LPsr as double 'profile sample rate (oftast 0.1 (m))
Dim LP(1000) as double 'LängsProfilen (array)
'UT
Dim LPf(1000) as double 'tar emot den filtrerade LängsProfilen
dim ref as component.class
set ref = createobject("component.class")
LPf = ref.DotheMagicStuff(LP,LPsr,HighPf,LowPf)
set ref = nothing
' Take care of the returned data...
</code>