[C#] DLL laden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mickvdv
  • Registratie: November 2006
  • Laatst online: 25-06 11:54

mickvdv

mv $homework //dev/null

Topicstarter
Hallo

Voor mijn profielwerkstuk ben ik bezig een printerpoort aan te sturen. Hiervoor wil ik een C# een programma schrijven dat die poort aan stuurt.

Hiervoor heb ik een DLL gevonden, IO.dll , alleen ik heb geen idee hoe ik die moet laden in C#. Gewoon als Reference toevoegen werkt niet, hij zegt dan "Not valid assembly". Op internet vond ik "[DllImport("io.dll")]", maar dan geeft visualstudio de fout "Type or namespace DllImport nog found".

Dit is voor het eerst dat ik iets met DLL's doe. Heeft iemand een idee hoe ik dit zou moeten aanpakken?

Alvast bedankt,

Groeten,

Mick van der Vegt

Acties:
  • 0 Henk 'm!

  • mendel129
  • Registratie: Juni 2005
  • Laatst online: 19:31

mendel129

Radioactivator

[DllImport("User32.dll")] moet werken...

Als je die foutmelding intypt op google geeft deze als eerste hit http://bytes.com/topic/c-...dllimport-could-not-found
Kan je eens proberen? :+

Bringer of heat, food and silence!


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Wat heb je zelf al geprobeerd? Google leidt je zo naar:
http://msdn.microsoft.com...a984739%28v=vs.71%29.aspx

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • mickvdv
  • Registratie: November 2006
  • Laatst online: 25-06 11:54

mickvdv

mv $homework //dev/null

Topicstarter
Ik ben op het volgende gekomen, via internet:

[DllImport("io.dll")]
static extern void PortOut(int Port, char Data);

De functie aanroepen kan wel, maar als het heeft helemaal geen effect op de printerpoort. Ik kan doen wat ik wil, de printerpoort geeft geen andere uitvoer.

Ik heb gekeken naar LoadLibrary en kwam op dit, hiervan heb ik gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        private delegate void PortOut(int Port, byte Data);
        

        public AansturingLPT()
        {
            // create the class

            IntPtr pDll = NativeMethods.LoadLibrary("io.dll");
            //oh dear, error handling here
            //if (pDll == IntPtr.Zero)

            IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "PortOut");
            //oh dear, error handling here
            //if(pAddressOfFunctionToCall == IntPtr.Zero)

            PortOut portout = (PortOut)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,
                                                                                    typeof(PortOut));

            portout(378, 0);
        }


Dit geeft ook geen fouten, maar met de printerpoort gebeurt niks.




Ditzelfde heb ik met PortIn gedaan, die geeft wel een waarde terug: 511, wat mij vrij raar lijkt omdat het ding 1 byte is.

Maar als ik met parmon, de waarde van de poort verander blijft het nog steeds 511.

[ Voor 8% gewijzigd door mickvdv op 15-01-2011 14:04 ]


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Even wat voorbeeld code zoeken leverde me meteen deze site op: http://www.codeproject.com/KB/cs/csppleds.aspx Hier doen ze ook "iets" met de parallele port.

C#:
1
2
3
4
5
6
7
8
using System;
using System.Runtime.InteropServices;

public class PortAccess
{
    [DllImport("inpout32.dll", EntryPoint="Out32")]
    public static extern void Output(int adress, int value);
}


Ze importeren hier zoals je ziet "inpout32.dll". LPT1 aan roepen zou zo moeten gaan:
C#:
1
2
3
int adress = 888;  //0x378 in HEX
in value = 3;  //whatever je wilt sture"
Output(adress, value);


Maar neem voor de zekerheid even dat hele project door (kijken even of het werkt bijvoorbeeld).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • mickvdv
  • Registratie: November 2006
  • Laatst online: 25-06 11:54

mickvdv

mv $homework //dev/null

Topicstarter
Ik heb het werkend gekregen. De fout die ik maakte was dat ik dacht dat 378 een decimaal getal was, maar het was hexadecimaal. Met deze code werkt het dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        private delegate void PortOut(int Port, byte Data);
        private delegate int PortIn(int Port);
        

        public AansturingLPT()
        {
            // create the class

            IntPtr pDll = NativeMethods.LoadLibrary("io");
            //oh dear, error handling here
            //if (pDll == IntPtr.Zero)

            IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "PortOut");

            PortOut portout = (PortOut)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,
                                                                                    typeof(PortOut));

            pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "PortIn");

            PortIn portin = (PortIn)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,
                                                                                    typeof(PortIn));
            portout(888, 0);
            MessageBox.Show(portin(888).ToString()); ;
        }


Bedankt voor jullie hulp!
Pagina: 1