Avatar billede jazz78 Nybegynder
22. oktober 2004 - 12:10 Der er 8 kommentarer og
1 løsning

DeviceIOControl C++ til C#

Jeg er ny i C#, og har noget C++ kode jeg skal have oversat til C#. Jeg har nogle værdier gemt i en struct, som jeg skal have sendt til en driver.

Til dette formål benytter jeg funktionerne createFile og deviceIOControl. Er det ikke rigtigt at de kan benyttes i C# vha. dll imports? (dette er vist nedenfor)

Men når jeg skal sende værdierne til driveren, skal dette ske med parametren "IntPtr lpInBuffer". I C++ angiver man bare en reference til instansen af structen, men hvordan gøres dette i C#. Her skal man angive en IntPtr, men kan denne være en slags pointer til structen??.

using System.Runtime.InteropServices;

[DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);

[DllImport("kernel32.dll", SetLastError = true)]
        static extern bool DeviceIoControl(
            IntPtr hDevice,
            uint dwIoControlCode,
            IntPtr lpInBuffer,
            uint nInBufferSize,
            [Out] IntPtr lpOutBuffer,
            uint nOutBufferSize,
            ref uint lpBytesReturned,
            IntPtr lpOverlapped);
Avatar billede arne_v Ekspert
22. oktober 2004 - 19:56 #1
Jeg mener at du skal:

IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(dinstruct));
Marshal.StructureToPtr(dinstruct,p,true);

for at få en "rigtig" IntPtr !
Avatar billede jazz78 Nybegynder
25. oktober 2004 - 09:13 #2
Undskyld jeg først vender tilbage nu, men har været væk i weekenden.

Jeg har prøvet det du foreslår, men får følgende fejlmeddelelse ved brug af SizeOf på structen:

Additional information: Type Test_joystick.joystickState can not be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
Avatar billede arne_v Ekspert
25. oktober 2004 - 10:11 #3
Så skal du nok have nogle attributter på nogle af felterne i structen, spom
fortælle rhvordan den skal serialiseres.

Kan du poste struct'en ?
Avatar billede jazz78 Nybegynder
25. oktober 2004 - 10:40 #4
ja, den ser sådan her ud:

public struct joystickState
{
    public ulong Signature;                   
    public char    NumAnalog;           
    public long [] Analog;                   
    public char    NumDigital;                   
    public char [] Digital;               
}
Avatar billede arne_v Ekspert
25. oktober 2004 - 10:44 #5
Der er uden tvivl

public long [] Analog;

og

public char [] Digital;

som driller
Avatar billede arne_v Ekspert
25. oktober 2004 - 10:50 #6
Prøv:

[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]
public long [] Analog;

[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
public char [] Digital;

ret selv 4 og 8 til det faktiske antal elementer i arrayene
Avatar billede jazz78 Nybegynder
25. oktober 2004 - 11:07 #7
Det ser ud til at virke.

Mange tak for hjælpen arne_v!
Avatar billede jazz78 Nybegynder
25. oktober 2004 - 11:12 #8
Nu mangler jeg bare at give dig points. Skal du "svare" før jeg kan gøre det?
Avatar billede arne_v Ekspert
25. oktober 2004 - 11:29 #9
ja

kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester