Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Skicka en Variabel till en DLL.....

Postades av 2007-12-26 23:57:17 - Niklas Rosenberg, i forum visual basic - allmänt, Tråden har 26 Kommentarer och lästs av 1205 personer

Skall skicka en Array till en Function i en DLL....

Def enligt nedan...
int __stdcall Lumax_SendFrame(int Handle, TLumax_Point *Points, int NumOfPoints, int ScanSpeed, int UpdateMode, int *TimeToWait)

Sendet einen Laserframe mit der angegebenen Anzahl Punkten an die Ausgabekarte.

Handle-Handle zur eindeutigen Identifizierung des Geräts
Points-Zeiger auf einen Speicherbereich, in dem nacheinander alle Punkte des Frames hinterlegt sind. Die einzelnen Punkte haben den Datentyp TLumax_Point (siehe unten).
NumOfPoints-Gibt die Anzahl der Punkte des Frames an.
ScanSpeed-Gibt die Ausgabegeschwindigkeit (PPS, points per second) an. Gültig sind Werte zwischen 250 und 70000 PPS. Diese Ausgabegeschwindigkeit kommt erst zur Anwendung, wenn die Ausgabe dieses Frames startet. Die Geschwindigkeit eines möglicherweise aktuell noch laufenden Frames wird nicht geändert.
UpdateMode-Immer auf 0 setzen.
TimeToWait-Immer auf 0 setzen.

Jaja.. tyska jag vet....
Och i C++... Men jag skriver i VB och får inte i ordning på det...

Type TLumax_Point
Ch1 As Integer
Ch2 As Integer
Ch3 As Integer
Ch4 As Integer
Ch5 As Integer
Ch6 As Integer
Ch7 As Integer
Ch8 As Integer
TTL As Integer
End Type

Declare Function Lumax_SendFrame Lib "lumax.dll" (Handle As Integer, ByRef SendPoint As TLumax_Point, NoPoints As Long, ScanSpeed As Long, UpdateMode As Long, TimeToWait As Long) As Long



Funktionen som skall anropa:
Public Sub LaserSkickaFrame()
Dim SendPoint() As TLumax_Point
For Rkn = 0 To 3
If (MLHandle(Rkn) >= 0) Then
ReDim Preserve SendPoint(0 To UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point))
For Rkn2 = 0 To UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point)
SendPoint(Rkn2).Ch1 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).X
SendPoint(Rkn2).Ch2 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).Y
SendPoint(Rkn2).Ch3 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).R
SendPoint(Rkn2).Ch4 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).G
SendPoint(Rkn2).Ch5 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).B
SendPoint(Rkn2).Ch6 = 0
SendPoint(Rkn2).Ch7 = 0
SendPoint(Rkn2).Ch8 = 0
SendPoint(Rkn2).TTL = 0
Next Rkn2
Tmp = Lumax_SendFrame(MLHandle(Rkn), SendPoint, UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point) + 1, ProgramForm.MaxScannerPPS(Rkn), 0, 0)
End If
Next Rkn
End Sub

När jag anropar Lumax_SendFrame får jag
ByRef argument type Mismatch
på SendPoint

Vad har jag defenierat fel? För vad jag fattat rätt så vill TLumax_SendFrame bara ha "pekaren" till SendPoint....


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-27 11:56:27 - Sven Åke Persson

Det jag kan bidraga med är att Arrayer skall skickas ByReference (man skickar adressen till Array:en)
DVS du skall inte skriva ByVal när du skickar Arrayer.
Sedan är det något med NullTerminated dvs avsluta med Null vbNull

Någon därute som kan fylla i mitt luddiga svar ?


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2007-12-27 13:31:28 - Niklas Jansson

prova:
Lumax_SendFrame(MLHandle(Rkn), SendPoint(1), UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point) + 1, ProgramForm.MaxScannerPPS(Rkn), 0, 0)


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-27 17:34:49 - Niklas Rosenberg

Har forskat lite inder arbetet idag och det kan även ha att göra med att int i C++ är på 2byte och long i VB är på 4 så om jag skickar en det med LONG så tar den i intar ur varje Long.
Hittade hur man räknade om en Signed LONG 4 byte till unsigned Int 2 byte...
Skall prova och medela här...


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-27 17:49:06 - Göran Gustafsson

Det ska nog vara
Declare Function Lumax_SendFrame Lib "lumax.dll" (byval Handle As Long, ByRef SendPoint As TLumax_Point, byval NoPoints As Long, byval ScanSpeed As Long, byval UpdateMode As Long, byref TimeToWait As Long) As Long

Alla * i definitionen ska vara ByRef, alla övriga parametrar ByVal. ByRef är default, så ByVal måste skrivas ut.

Om TLumax_Point innehåller integers i DLL:en måste du ha Long i VB.


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2007-12-27 18:01:04 - Niklas Rosenberg

Om jag kör:

Tmp = Lumax_SendFrame(MLHandle(Rkn), SendPoint, UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point) + 1, ProgramForm.MaxScannerPPS(Rkn), 0, 0)

Så får jag fel på SendPoint:

User-defined type may not be passed ByVal

Med följande def:

Declare Function Lumax_SendFrame Lib "lumax.dll" (Handle As Integer, ByVal SendPoint As TLumax_Point, NoPoints As Integer, ScanSpeed As Integer, UpdateMode As Integer, TimeToWait As Integer) As Integer


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-27 18:28:08 - Göran Gustafsson

Ändra deklarationen enligt mitt förra inlägg.

Den sista parametern ska ta emot värdet, måste alltså vara en variabel.
Gör även så här för säkerhets skull:
Dim tmp1 as Long
Dim tmp2 as Long
Dim tmp3 as Long
Dim tmp4 as Long

tmp1=MLHandle(Rkn)
tmp2=UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point) + 1
tmp3=ProgramForm.MaxScannerPPS(Rkn)
tmp4=0
tmp5=0

Anropet blir
Tmp = Lumax_SendFrame(tmp1, SendPoint, tmp2, tmp3, tmp4, tmp5)


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2007-12-27 19:17:45 - Niklas Rosenberg

Då blev det:

Public Sub LaserSkickaFrame()
Dim SendPoint() As TLumax_Point
Dim tmp1 As Integer
Dim tmp2 As Integer
Dim tmp3 As Integer
Dim tmp4 As Integer
Dim tmp5 As Integer

    For Rkn = 0 To 3
        If (MLHandle(Rkn) >= 0) Then
            ReDim Preserve SendPoint(0 To UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point))
            For Rkn2 = 0 To UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point)
                SendPoint(Rkn2).Ch1 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).X
                SendPoint(Rkn2).Ch2 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).Y
                SendPoint(Rkn2).Ch3 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).R
                SendPoint(Rkn2).Ch4 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).G
                SendPoint(Rkn2).Ch5 = Pict(FrameNumber.Value).Scanner(Rkn).Point(Rkn2).B
                SendPoint(Rkn2).Ch6 = 0
                SendPoint(Rkn2).Ch7 = 0
                SendPoint(Rkn2).Ch8 = 0
                SendPoint(Rkn2).TTL = 0
            Next Rkn2
        
        tmp1 = MLHandle(Rkn)
        tmp2 = UBound(Pict(FrameNumber.Value).Scanner(Rkn).Point) + 1
        tmp3 = ProgramForm.MaxScannerPPS(Rkn)
        tmp4 = 0
        tmp5 = 0
        
        Tmp = Lumax_SendFrame(tmp1, SendPoint, tmp2, tmp3, tmp4, tmp5)
        End If
    Next Rkn
End Sub


Def:
Declare Function Lumax_SendFrame Lib "lumax.dll" (ByVal Handle As Integer, ByRef SendPoint As TLumax_Point, ByVal NoPoints As Integer, ByVal ScanSpeed As Integer, ByVal UpdateMode As Integer, ByRef TimeToWait As Integer) As Integer


Och:
Type TLumax_Point
    Ch1 As Integer
    Ch2 As Integer
    Ch3 As Integer
    Ch4 As Integer
    Ch5 As Integer
    Ch6 As Integer
    Ch7 As Integer
    Ch8 As Integer
    TTL As Integer
End Type


Felmedelande:
ByRef argument type mismatch

Ändrade från LONG till Integer för att det skall vara 2Byte....


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-27 19:23:34 - Göran Gustafsson

Du måste använda Long, inte Integer.

Vem har gjort DLL:en? Är du säker på att en int där inte är 32 bit?


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2007-12-29 16:16:06 - Per-Olof Ohlsson

För att verkligen få en pekare till första elementet i arrayen måste du nog skriva anropet:

Lumax_SendFrame(tmp1, SendPoint(0).Ch1, tmp2, tmp3, tmp4, tmp5)

men jag misstänker också att det kan bli andra problem om du skapar arrayen dynamiskt.

Jag är inte säker, men har för mig att en array av egendefinerade typer består av referenser (pekare) till de ingående elementen när man skapar den dynamiskt.


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-30 12:45:36 - Niklas Rosenberg

Ah... Pellesoft nere i 2 dagar när jag har något att skriva.. Hm.. Ler..

Hårdwaran jag försöker kominucera med är köpt av ett kille i Tyskland som sålt hårdwaran till ett företag som säljer den...

DLLen finns förklarad på:
lumax.dll
Vore tacksam om någon med lite C++ kunskaper hade tid i 2min och översatta Funktionernaanropen i DLLen så jag får allt rätt från början...
Alltså vad jag skriver i deklarationen av Funktionerna i mitt program...
Även Variabelstruturen som används..

Just nu är Deklarationerna:
Declare Function Lumax_GetPhysicalDevices Lib "lumax.dll" () As Long
Declare Function Lumax_GetDeviceInfo Lib "lumax.dll" (PhysicalDevice As Byte, DeviceInfo As String) As Long
Declare Function Lumax_OpenDevice Lib "lumax.dll" (PhysicalDevice As Byte, Channel As Byte) As Long
Declare Function Lumax_CloseDevice Lib "lumax.dll" (Handle As Integer) As Long
Declare Function Lumax_StopFrame Lib "lumax.dll" (Handle As Integer) As Long
Declare Function Lumax_SendFrame Lib "lumax.dll" (ByVal Handle As Integer, ByRef SendPoint As TLumax_Point, ByVal NoPoints As Integer, ByVal ScanSpeed As Integer, ByVal UpdateMode As Integer, ByRef TimeToWait As Integer) As Integer

Och om det är strul med att den skall ha 2Byte variabler (int = 2 byte) så gör det inget om innehålet blir för för det går att räkna om.. Har redan löst det så -32xxx till +32xxx -> 0 till 65xxx....


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2007-12-30 16:17:01 - Per-Olof Ohlsson

En int i C++ är 32 bit (i Windows), alltså skall int genomgende bli Long i VB6.
Så alla returvärden är alltså Long.

Datatypen TLumax_Point består av ett antal unsigned short, alltså 16 bit, dessa blir i VB till Integer.
(Det finns ju tyvärr inga unsigned i VB6).

Deklarationerna:
Declare Function Lumax_GetPhysicalDevices Lib "lumax.dll" () As Long
är OK.

Declare Function Lumax_GetDeviceInfo Lib "lumax.dll" (PhysicalDevice As Byte, DeviceInfo As String) As Long
Denna är ju reserverad för framtida bruk enligt hemsidan och har en void pointer som andra
argument. Går därför inte att deklarera korrekt i VB f.n. men det närmaste blir
Declare Function Lumax_GetDeviceInfo Lib "lumax.dll" (PhysicalDevice As Long, DeviceInfo As Long) As Long
PhysicalDevice är en C++ int, skall alltså vara en long i VB. En void pointer kan peka på vad
som helst, t.ex. en Long.



Declare Function Lumax_OpenDevice Lib "lumax.dll" (PhysicalDevice As Byte, Channel As Byte) As Long
skall vara
Declare Function Lumax_OpenDevice Lib "lumax.dll" (PhysicalDevice As Long, Channel As Long) As Long
(se ovan om int <-> Long) notera även att Channel alltid skall vara 0, och om du skriver 0 direkt i
anropet måste det skrivas som 0& för att skapa en 32 bits 0:a, detta för att undvika stackproblem.

Declare Function Lumax_CloseDevice Lib "lumax.dll" (Handle As Integer) As Long
skall vara
Declare Function Lumax_CloseDevice Lib "lumax.dll" (Handle As Long) As Long


Declare Function Lumax_StopFrame Lib "lumax.dll" (Handle As Integer) As Long
skall vara
Declare Function Lumax_StopFrame Lib "lumax.dll" (Handle As Long) As Long


Declare Function Lumax_SendFrame Lib "lumax.dll" (ByVal Handle As Integer, ByRef SendPoint As
TLumax_Point, ByVal NoPoints As Integer, ByVal ScanSpeed As Integer, ByVal UpdateMode As Integer,
ByRef TimeToWait As Integer) As Integer

skall i konsekvens med ovan vara

Declare Function Lumax_SendFrame Lib "lumax.dll" (ByVal Handle As Long, ByRef SendPoint As
TLumax_Point, ByVal NoPoints As Long, ByVal ScanSpeed As Long, ByVal UpdateMode As Long, ByRef
TimeToWait As Long) As Integer

[Edit]
tänk även här på att UpdateMode skall vara 0 och att i anropet skriva 0& för att skapa en 32-bit 0:a
TimeToWait skall också vara 0 enligt hemsidan fast är deklarerad som en pekare. Det är lite tvetydigt
då de sedan i exemplet skriver 0 och inte Null. Jag skulle skapa en Long variabel och skicka med den i
anropet.
[/Edit]

Type-deklarationen som du skrivit tidigare i tråden är ok.

Men skapa istället en statisk array med tillräcklig storlek för det största du tänkt dig, sedan vet ju dll:en
hur stor del av arraydn den skall använda via NoPoint argumentet. Dynamiska arrayer ser inte alltid ut
som man tänkt sig när de väl skapas i minnet utan består ofta av en array av pekare istället för
element.

Ett annat problem du ev kan få här är att TLumax_Point består av 9 st 16 bitars värden, vilket blir 18
byte. Detta går inte jämt ut med VB6 4-bytes alignment, det finns en risk här att VB lägger till två byte
mellan varje element i arrayen för att nästa element skall starta på jämn 4-byte address. I VB6 går
inte detta att styra tyvärr (går däremot i VB.NET). Om det blir så även här är jag inte helt säker på, det
blir det i alla fall när man har olika typer inom den egendefinerade typen.

Och sen som jag nämnde ovan, för att få adressen till första elementet i arrayen måste du skriva den
första primitiva variabeln som förekommer i arrayen, dvs SendPoint(0).Ch1, inte bara arraynamnet.
VB6 fungerar inte på det viset vid anrop av dll:er.


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2007-12-30 19:02:20 - Niklas Rosenberg

TACKAR SÅ HEMSKT MYCKET....
Har inte hunnit prova än men det är skönt när något hjälper till....
Svarar om en liten stund när jag provat...


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-01 22:22:24 - Niklas Rosenberg

Jippi.. Det fungerade nästan....
De flesta deklarationerna godtar den men den får inget Hårdvaru Handle tillbaka från Lumax_OpenDevice().....
Kan det vara något speciellt som den returnerar konstigt???
För när jag startat programmet och startar ett annat program så säger det programmet att mitt program använder DLL filen..
Det andra programmet är för att övervaka så att inte mitt program hänger sig och laserstrålen blir statisk --> Då de flesta showlasrarna är starka och bränner när de inte ritar.....
Så det verkar som mitt program öppnat hårdwaran men inte får Handlen....


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-02 10:34:55 - Per-Olof Ohlsson

Kul att det rör på sig.
Kan du visa hur du gör anropet till OpenDevice ?


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-02 13:57:55 - Niklas Rosenberg

ShowMLHandle(0).Caption = Lumax_OpenDevice(0, 0)
ShowMLHandle(1).Caption = Lumax_OpenDevice(1, 0)
ShowMLHandle(2).Caption = Lumax_OpenDevice(2, 0)
ShowMLHandle(3).Caption = Lumax_OpenDevice(3, 0)

Declare Function Lumax_OpenDevice Lib "lumax.dll" (PhysicalDevice As Long, Channel As Long) As Long

Som du ser så försöker jag öppna de 4 första Platserna bara för att se om det är någon som svarar...
Det står i Infon att det bara kan vara 1-3......

Just nu känns det som det är något fel med Returen från OpenDevice...
Om den returnerar en pekare skall den då Skrivas som LONG? Skall det inte vara LONG& eller något liknande??


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-02 18:04:09 - Per-Olof Ohlsson

Jag tycker du skall börja med att anropa

Dim lNoOfDevices as Long
lNoOfDevices = Lumax_GetPhysicalDevices()

om lNoOfDevices = 0 hittar den inte hårdvaran, du borde få 1 (eller så många devices som du har)
som svar här. Får du 0 är inte hårdvaran rätt installerad eller så saknas en drivrutin eller nåt.

Vid Open sedan, som jag skrev ovan, skall andra parametern vara en Long fast 0 alltså skall
du skriva 0& anropa alltså med

ShowMLHandle(1).Caption = Lumax_OpenDevice(1, 0&)

ShowMLHandle(0).Caption borde nu ge ett tal <> 0, dvs ett 32 bitars heltal, det är det som ett
handle är. Det är ingen pekare (inte direkt i alla fall) utan en identifierare.

Får du 0 kunde inte devicen öppnas och det är trots allt något installationsstrul.

Jag förmodar att hårdvaran levererades med en driver, eftersom en dll i usermode inte kan
accessa hårdvaran direkt. Är den drivern installerad OK? Finns det något annat program som
fungerar med hårdvaran på denna PC:n, t.ex. från tillverkaren?


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-02 20:01:11 - Niklas Rosenberg

Japp...
I programmet Original så har jag en Devices som är en long..

Devices=Lumax_GetPhysicalDevices
For Rkn=1 to Devices
ShowMLHandle(Rkn).Caption = Lumax_OpenDevice(Rkn, 0)
Next Rkn

Och Ja... Den hittar 1 enhet...
Men Lumax_OpenDevice(1,0) returnerar 0....
Men skall Prova 0& när jag kommer hem från jobbet...

På hemsidan finns en programvara för att testa kortet och det fungerar perfekt..
Även Demoprogrammet för ett laserprogram fungerar perfekt..
Testprogrammet fungerar även som ett SAFE program så man kan starta sitt program och sedan Testprogrammet så övervakar det ens program.
När jag startat mitt program och sedan TestProgrammet så säger det att mitt program är anslutet till DLLen...

I testprogramskatalogen ligger även en mld.dll fil men skulle den saknas så borde la programmet klaga när man försöker starta det??? Eller?


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-03 08:56:36 - Per-Olof Ohlsson

Hmm..
Verkar skumt, 0& är nog inte problemet.
Exemplet använder ju vanlig 0.

mld.dll:
Den borde klaga men det skall man inte ge sig f-n på.

Har du Lumax-dll:en i samma katalog som din exe?
Prova i så fall att lägga dit mld.dll oxo. Vet inte vad den är till för, verkar vara nåt med grafik.

Kan du maila hela den berörda koden ?


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-03 13:28:18 - Niklas Rosenberg

Fick Mail idag från han som gjort programmet som säljs...
Han skriver i VB....
Har inte hunnit kolla igenom vad han skrivit exakt än man skall göra det så fort som möjligt..
Kan maila dig min kod...
Såg att du bor i Jönköping...
Vill du prova kod och kortet så kan ajg ta med det ner.. Är i Jönköping varje helg i Jan.......


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-03 13:29:43 - Niklas Rosenberg

Glömde ju skicka hans kod...

Lumax_API_Version = Lumax_GetApiVersion
Delay (100)
If Lumax_API_Version < 206 Then MsgBox Message(Language, 593) & Lumax_API_Version ' the message is: Please use dll version 206 or higher.
 
KartenAnzahl = Lumax_GetPhysicalDevices
Delay (100)
DoEvents

For i = 1 To KartenAnzahl
    Delay (100)
    LumaxHandleTemp = Lumax_OpenDevice(i, 0)     ko = 4
    LumaxHandle(i) = LumaxHandleTemp
    For j = 0 To formOptionen.lstHardware.count - 1
                formOptionen.lstHardware(j).AddItem "Lumax" & i
    Next
    formOptionen.comboDMXPort(0).AddItem "Lumax DMX" & i
    formOptionen.comboDMXPort(1).AddItem "Lumax DMX" & i
Next
*****************************************************************************************************
 
 
This are my declarations: ( you will see, i split the 2 Byte values (unsigned int) into 2 separate Highbyte and Lowbyte.)
 
*************************************************************************************
 
'Aufbau der Punktinformation:
'Es handelt sich um lauter 16-Bit-Werte
'Ch1=X, byval Ch2=Y (byval 0=links/unten, byval 32768=mitte, byval 65535=rechts/oben)
'Ch3=rot, byval Ch4=gruen, byval Ch5=blau (byval 0=aus, byval 65535=volle Helligkeit)
'Ch6, byval Ch7, byval Ch8 ungenutzt
'TTL im Low-Byte stehen die 8 TTL-Ausgaunge
 

Type tLumaxInBuffer
    byte1 As Byte
    byte2 As Byte
    byte3 As Byte
    byte4 As Byte
End Type
 
Public LumaxInBuffer As tLumaxInBuffer
 

Type tLumaxOutBuffer
    byte1 As Byte
    byte2 As Byte
    byte3 As Byte
    byte4 As Byte
End Type
Public LumaxOutBuffer As tLumaxOutBuffer
 

Type tLumax_Punkt
    X0 As Byte
    X1 As Byte
    
    Y0 As Byte
    Y1 As Byte
   
    R0 As Byte
    R1 As Byte
    
    G0 As Byte
    G1 As Byte
 
    B0 As Byte
    B1 As Byte
 
    ch6l As Byte
    ch6h As Byte
    
    ch7l As Byte
    ch7h As Byte
    
    ch8l As Byte
    ch8h As Byte
    
    TTLl As Byte
    TTLh As Byte
 
End Type
Public LumaxDatenfeld() As tLumax_Punkt
 
 
 
'**** Dll Aufrufe fuer Lumax dll
 

Public Declare Function Lumax_GetPhysicalDevices Lib "Lumax.dll" () As Long   ' das c-integer entspricht dem vb Long??
'Liefert die Anzahl angeschlossener LumaxKarten
 

Public Declare Function Lumax_GetDeviceInfo Lib "Lumax.dll" (ByVal PhysicalDevice As Long) As Long
' Liefert ???
 
Public Declare Function Lumax_OpenDevice Lib "Lumax.dll" (ByVal PhysicalDevice As Long, ByVal Channel As Long) As Long
' oeffnet das angegebene Geraet fuer die weitere Nutzung.
' gibt den Handle des Geraetes zurueck, byval dieser wird fuer CloseDevice benoetigt
 

Public Declare Function Lumax_CloseDevice Lib "Lumax.dll" (ByVal Handle As Long) As Long
' Schließt das Geraet, byval so dass andere Programme darauf zugreifen koennen.
 
 
 
Public Declare Function Lumax_SendFrame Lib "Lumax.dll" (ByVal Handle As Long, ByRef Points As tLumax_Punkt, ByVal NumOfPoints As Long, ByVal ScanSpeed As Long, ByVal UpdateMode As Long, ByVal TimeToWait As Long) As Long
'  Sendet einen Laserframe mit der angegebenen Anzahl Punkten an die Ausgabekarte.
 

Public Declare Function Lumax_WaitForBuffer Lib "Lumax.dll" (ByVal Handle As Long, ByVal Timeout As Long, ByRef TimeToWait As Long, ByRef BufferChanged As Boolean) As Long
' Wartet auf das Freiwerden des Empfangspuffers bzw. liefert dessen Status zurueck.
 

Public Declare Function Lumax_StopFrame Lib "Lumax.dll" (ByVal Handle As Long) As Long
' Hault die Laserausgabe an. Alle Farbkanaule werden auf den Wert 0 gesetzt. X- und Y-Achse werden auf die Bildmitte positioniert. Alle TTL-Ausgaunge werden abgeschaltet.
 

Public Declare Function Lumax_SetDmxMode Lib "Lumax.dll" (ByVal Handle As Long, ByVal NumOfTxChannels As Long, ByVal NumOfRxChannels As Long) As Long
'Aktiviert bzw. deaktiviert den DMX512 Sender bzw. Empfaunger auf der Minilumax-Karte
'NULL als wert, byval bedeutet jeweils die fuktion Senden / Empfangen = Aus...
 

Public Declare Function Lumax_SendDmx Lib "Lumax.dll" (ByVal Handle As Long, ByRef DmxBuffer As Byte, ByVal Length As Long) As Long
' uebertraugt DMX512-Daten an den Ausgabepuffer der Minilumax-Karte.
' DmxBuffer ist ein Zeiger auf ein Array
 
 
 
Public Declare Function Lumax_ReceiveDmx Lib "Lumax.dll" (ByVal Handle As Long, ByRef DmxBuffer As Byte, ByVal Length As Long) As Long
' empfaungt DMX512-Daten anus den Empfangspuffer der Minilumax-Karte.
' DmxBuffer ist ein Zeiger auf ein Array
 

' Dongle Functionen
'int version = __stdcall Lumax_GetApiVersion
Public Declare Function Lumax_GetApiVersion Lib "Lumax.dll" () As Integer
 
'int result = __stdcall Lumax_Dongle_XTEA_Com(int Handle, int Command, unsigned long Vendor_ID, unsigned long *DataOut, unsigned long *DataIn)
Public Declare Function Lumax_Dongle_XTEA_Com Lib "Lumax.dll" (ByVal Handle As Long, ByVal Command As Long, ByVal Vendor_ID As Long, ByRef DataOut As Long, ByRef DataIn As Long) As Long
 

'Identifizierung:
'int result = __stdcall Lumax_ExchangeDevInfo(int Handle, int Info_ID, unsigned char *InBuffer, int InLength, unsigned char *OutBuffer, int OutLength)
Public Declare Function Lumax_ExchangeDevInfo Lib "Lumax.dll" (ByVal Handle As Long, ByVal Info_ID As Long, ByRef InBuffer As tLumaxInBuffer, ByVal InLength As Long, ByRef OutBuffer As tLumaxOutBuffer, ByVal OutLength As Long) As Long
 

Public Declare Function Lumax_SetTTL Lib "Lumax.dll" (ByVal Handle As Long, ByVal TTL As Long) As Long


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-03 13:51:01 - Niklas Rosenberg

Public Declare Function Lumax_OpenDevice Lib "Lumax.dll" (ByVal PhysicalDevice As Long, ByVal Channel As Long) As Long

Verkar fungera.... Eller ja.. Den Returnerar 1 och inte 0....
Vad är skillnaden på den och:
Declare Function Lumax_OpenDevice Lib "lumax.dll" (PhysicalDevice As Long, Channel As Long) As Long


MEN VB hänger sig andra gången man kör programmet...
Även om man Kompilerar en EXE fil och kör den utanför VB när VB är igång så hänger sig VB..
Och det blir när jag kör Lumax_GetPhysicalDevices....

Ja just det... Den verkar inte hitta:
Public Declare Function Lumax_SendFrame Lib "Lumax.dll" (ByVal Handle As Long, ByRef Points As tLumax_Punkt, ByVal NumOfPoints As Long, ByVal ScanSpeed As Long, ByVal UpdateMode As Long, ByVal TimeToWait As Long) As Long
Fast när jag tänker efter så har ju han tLumax_Punkt..
Kollar det när jag kommer hem...


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-03 14:16:26 - Per-Olof Ohlsson

Shit, tabbe av mig.

De flesta parametrar skall vara ByVal men det är inte default i VB6 (är det däremot i VB.NET, jag får skylla på det).
ByVal inne bär alltså att värdet skickas med, ByRef att en pekare till variablen skickas med. Tyvärr är ByRef default i VB6.

Använd hans deklarationer så blir det nog ok.

Sedan är hans lösning av unsigned int som två bytar en intressant variant, bör fungera utmärkt.

Vad är det här för grejor man styr? Vilken typ av laser och vad kan man göra med den?
Jag har faktiskt en applikation i jobbet där det ev kan vara intressant.


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-03 16:28:51 - Niklas Rosenberg

Jag fundera på om det kan ha varit att jag har Defenitionen av Functionen i en Modul och då skall man la kanske ha Funtionen som Public? Tänkte på det nu när jag var på väg till jobbet...

Det är ShowLasrar man styr med kortet...
Alltså skickar den X o Y positioner Tillsammans med Färgen i R,G,B form...
Så skickar man en hel bild som punkter...

Min ritare klarar 45000punkter i sekunden och om man ritar en bild med tex 100punkter och ritar den med full fart blir det 450ggr/s (Kanske lite överdrivet) och då uppfattar ögat det som en streckbild...
Sedan är det ju bara att ändra bilden så många gånger man vill så blir det allt från punkter till animeringar...

Sök gärna på YouTube på tex LaserShow Beam så får du se vad det blir.. Till saken hör att det aldrig blir bra på film...

Många av lasrarna har bara grönt... Vissa har grön/röd..... Vissa har grön/röd/blå...
Och med hjälp av det så kan du blande de flesta färgerna...

Kör med en totallasereffekt på ~0.5W Vit laser, 250mW röd, 150mW grön och 80mW blå.

Stillastående stråle så bränner jag igenom Svart ElTape med samtliga färger...

Det är riktigt kul att labba med den....
Tanken är att hyra ut den och tekniker på företagsjobb och disco.. Tyvärr finns det inte så mycket pengar i det men det är kul...


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-04 10:53:28 - Per-Olof Ohlsson

Om deklarationen ligger i en modul är den default public, så det är nog inget problem.

Jag har en applikation där jag skall visa hur olika detaljer skall placeras vid montering, dvs rita
en (eller flera) streckbild på en yta så att operatören ser var och hur detaljen skall placeras.

Vad kostar såna här grejor?


Svara

Sv:Skicka en Variabel till en DLL.....

Postades av 2008-01-04 11:58:23 - Niklas Rosenberg

Ok... Hur får du bilden?? Som CADfil eller skriver du in X,Y kordinater??
Du råkar inte ha något bra skript att convertera typ DWG filer eller liknande till vektorer?

Ja du..Köper man en liknande i Sverige så får man ge 50000kr och uppåt typ...
Det finns ioförsig billig skit och men.........
Jag har köpt min i delar med en massa fjäsk hos tillverkarna i Kina och Tyskland så jag har kanske gett 30000 för den när den är klar men då har jag valt bra produkter rakt igenom...
Det är en gammal hobby sedan jag gick på gymnasiet att hålla på med laser och showlaser men innan har det varit små billiga saker..
Nu fick jag en massa bra dealar med så då kunde jag inte låta bli...

Har egentligen bara höljet kvar att göra... Allt sitter fastmonterat på en 5mm tjock Aluplåt...
Letar efter företag som säljer AluLister för TMuttrar....


Svara

Sv: Skicka en Variabel till en DLL.....

Postades av 2008-01-04 16:52:57 - Niklas Rosenberg

ITS ALIVE!!!
Eller ja.. Den ritar men fel så jag får felsöka lite när jag kommer hem från jobbet...
Han inte göra det.. Konstatera bara att den började rita..
Eller ja... Först hade jag ju glömt ändra från min Lumax_Point till hans med byte så den gjorde en massa konstigt...
Sedan han jag byta och den ritade bara fel men jag kan ha råkat skifta Högabyte mot lågabyte... Kom på det när jag kom till jobbet....

PeO:
Såg föresten att vi jobba med nästan med samma sak...
Jobbar som akutelektriker på Volvo Powertrain med S5 o S7...
Har ju sett din firma ett par gånger när jag varit nere i Jönkping fast jag inte har tänkt på det...


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 725
27 958
271 751
920
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies