Goedeavond

Ik heb een velleman v140 USB interface bordje. Ik wil in C# software schrijven die dit bordje aanstuurt.

Ik heb al veel info gevonden, ook op dit forum maar toch zit ik met een probleem.

Om te beginnen moet ik het dll bestand toevoegen, ik doe dit door:


[DllImport("K8061.dll")]
        private static extern int OpenDevice(int CardAddress);

private void Form1_Load(object sender, EventArgs e)
        {
            if (OpenDevice(0) > 1)
            {
                MessageBox.Show("succes");
            }
            else
            {
                MessageBox.Show("error");
            }

        }


Maar ik krijg een did not found exception.

-gebruik ik de juiste DLL? Kan hier niet aan liggen, want dan kreeg ik geen dit not found melding
- Ik heb het dll bestand in mijn projectmap geplaatst

Waar kan dit nog aan liggen?

Yep, dat had ik hier ook ergens voorbij zien komen...

Maar niet iedereen vindt dat een goed idee precies?

*edit*

Als ik een dll aanroep die niet bestaat, krijg ik geen didnotfound error :)

[Bericht gewijzigd door LJ Chris op (29%)]

hoezo is het toevoegen van de DLL aan je system32 folder geen goed idee?
dat is de standaard plek zo ongeveer.

Ofwel moet je een reference doen naar waar de dll staat.

overgens is je import wel goed.
proberen zoals in het dit topic: http://www.circuitsonline.net/forum/view/46314/1

[Bericht gewijzigd door timmie op (12%)]

Je kunt DLL's ook in dezelfde directory als de .exe zetten (bin/debug en bin/release). References zijn alleen voor .NET DLLs (voor zover ik weet).

je kan K8055D meegeven als reference de pest is echter wel dat het geen DotNet liberary is dus moet je nog alles gaan importeren(net getest).

/edit:
heb de verkeerde lib zitten testen(had de K8061 dll moeten zijn).

[Bericht gewijzigd door timmie op (21%)]

Ik geloof dat het ook te maken heeft met de verschillende lengtes van int's, booleand,longs etc etc.

zoals bij het aanroepen van het versie nummer van de dll wordt het in het voorbeeld in VB zo gedaan :

Private Declare Sub ReadVersion Lib "k8061.dll" (ByVal CardAddress As Long, Buffer As Long)

Wordt als "Long" in dll gebruikt en ook als "Long" opgevraagd, maar bijvoorbeeld

Private Declare Function Connected Lib "k8061.dll" (ByVal CardAddress As Long) As Boolean

hier wordt een long omgezet naar een boolean.
Daar moet je dus even goed naar kijken welke functie je gebruikt.

Er staat trouwens ook hier : http://msdn.microsoft.com/en-us/magazine/cc164123.aspx goed voorbeeld over het gebruik van het aanroepen van DLL's

[Bericht gewijzigd door D-Force op (11%)]

D-Force wel opletten er wordt helemaal nix omgezet.
de eerste is een sub(dus een functie zonder return).
de 2e is een functie die een parameter meekrijgt van het type Long en een return waarde terug geeft van het type boolean.

overgens maakt het in DotNet talen niet meer uit wat de declare is het zijn unified type's dus de type's zijn in alle talen het zelfde.

gebuik in VB een Char dan kan ik dat in VC# ook.
zelfde voor Int, long, single, double, decimal, string, byte, boolean, date, object, short. Signed en unsigned kan ook allemaal uitgewisseld worden.

In VS2010 willen ze daar nog een stap verder in gaan en directe syntax over te nemen uit andere talen

/edit:
er wordt een integer terug gegeven van de functie OpenDevice()

die integer laat ofwel zien: welke kaart(en) er aangesloten zijn. ofwel welke error er aanwezig is.
dat ding neemt geen parameters mee.
zie windows vista pack 2007

/edit 2:
even de vb listing er bij gehaald



    Private Declare Function OpenDevice Lib "k8061.dll" () As Integer
    Private Declare Sub CloseDevices Lib "k8061.dll" ()
    Private Declare Function ReadAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer) As Integer
    Private Declare Function PowerGood Lib "k8061.dll" (ByVal intCardNumber As Integer) As Boolean
    Private Declare Function Connected Lib "k8061.dll" (ByVal intCardNumber As Integer) As Boolean
    Private Declare Sub ReadVersion Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub ReadAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub OutputAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer, ByVal Data As Integer)
    Private Declare Sub OutputAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub ClearAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub SetAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub ClearAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub SetAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub OutputAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Data As Integer)
    Private Declare Sub ClearDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub ClearAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub SetDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub SetAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Function ReadDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer) As Boolean
    Private Declare Function ReadAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer) As Integer
    Private Declare Sub OutputPWM Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Data As Integer)
    Private Declare Sub Version Lib "k8061.dll" ()

Ik weet dat het niet helemaal hier thuis hoort, maar weet iemand hoe je een pointer naar een struct meegeeft in C#?
Ik was gisteren de hele avond al aan het knoeien maar krijg het niet voor mekaar.

de functie aanroep is NCTYPE_STATUS ncRead(
NCTYPE_OBJH ObjHandle,
NCTYPE_UINT32 DataSize,
NCTYPE_ANY_P DataPtr);

waarbij de DataPtr een pointer naar een struct is volgens:


        [StructLayout(LayoutKind.Sequential)]
        public struct canFrames
        {
            public byte FrameType;
            public UInt32 ArbitrationId;
            public System.Runtime.InteropServices.ComTypes.FILETIME Timestamp;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public Byte[] Data;
            public Byte DataLenght;
        }

Dll aanroep:


        [DllImport("nican.dll")]
        public static extern unsafe UInt32 ncRead(UInt32 objHandle, UInt32 dataSize, out DataPtr);

Functie aanroep:


CAN.canFrames CanData = new CAN.canFrames();
ReturnCan = CAN.ncRead(handle, 8, CAN.canFrames);

Voordat iemand zegt dat het meer iets is voor tweakers, daar heb ik het ook al gevraagt, en het is voor het aansturen van een eigengemaakte print met een CAN Adapter van NI die dus nog niet werkt...