Wrapper libMPSSE_SPI do C# – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Wrapper libMPSSE_SPI do C# – .NET – Fórum – Programujte.comWrapper libMPSSE_SPI do C# – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
31. 5. 2016   #1
-
0
-

   

typedef struct _ft_device_list_info_node {
   DWORD Flags;
   DWORD Type;
   DWORD ID;
   DWORD LocId;
   char SerialNumber[16];
   char Description[64];
   FT_HANDLE ftHandle;
} FT_DEVICE_LIST_INFO_NODE;

//funkci se preda ukazatel na vyse uvedenou strukturu
FT_STATUS SPI_GetChannelInfo(uint32 index, FT_DEVICE_LIST_INFO_NODE *chanInfo);


Zkoušel jsem do C# převést takto: 

public struct FT_DEVICE_LIST_INFO_NODE
        {
            public uint Flags;
            public uint Type;
            public uint ID;
            public uint LocID;
            public byte[] SerialNumber;
            public byte[] Description;
            public uint ftHandle;
        }

[DllImport("libMPSSE.dll", CallingConvention = CallingConvention.Cdecl)]
        protected static extern uint SPI_GetChannelInfo(uint index, ref FT_DEVICE_LIST_INFO_NODE chanInfo);


Při volání funkce nastane vyjímka Acces Violation...

Jak správně napsat strukturu aby to fungovalo?

hu

Ahoj,

mám problém s použitím struktury. Původní C kód je:

Nahlásit jako SPAM
IP: 195.178.67.–
NeregistrovanyHookyns
~ Anonymní uživatel
62 příspěvků
31. 5. 2016   #2
-
0
-

Třeba pomůže: http://stackoverflow.com/questions/21460591/wrapping-native-c-struct-in-c-cli

Nahlásit jako SPAM
IP: 77.95.192.–
31. 5. 2016   #3
-
0
-

Struktura není v DLL, je jen její datový typ v hlavičkovém souboru. Jinak řečeno, je potřeba vytvořit odpovídající datový typ v C#. A předat importované funkci uakzatel (asi referenci). Asi je problém s poli char a jejich vhodnou náhradou.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
NeregistrovanyHookyns
~ Anonymní uživatel
62 příspěvků
31. 5. 2016   #4
-
0
-

Pokud může být chyba přímo v datových typech, tak můžeš mít špatně nahrazené DWORD za uint. DWORD by měl být v posledních verzích windows UInt32, ale nevím na čem běžíš, takže můžeš mít jiné DWORD a můžeš mít i jiný uint, který používáš.

Proč jsi nahradil char[] za byte[]? 

V C# máš LocID místo LocId.

FT_HANDLE je PVOID, tedy nějaký obecný ukazatel. Zkusil bych třeba typ object. Uint by to teoreticky mohl být také, ale jen v případě, že jsi na 32bit systému.

To jsou věci co mě na první pohled napadly. Ještě popřemýšlím.

Nahlásit jako SPAM
IP: 77.95.192.–
BDS+3
Věrný člen
31. 5. 2016   #5
-
0
-

#1 hlucheucho
Nevím, neznám, ani jsem nehledal info na netu, ale já bych ten převod spíše zkusil řešit nějak takto: 

[StructLayout(LayoutKind.Sequential, Pack = 1)] //klidně i "Pack = 4"
public class FT_DEVICE_LIST_INFO_NODE
        {
            public uint Flags;
            public uint Type;
            public uint ID;
            public uint LocID;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] SerialNumber; //pokud je to unicode tak, char
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
            public byte[] Description; // -||-
            public uint ftHandle; // tady to asi bude ukazatel..

            public FT_DEVICE_LIST_INFO_NODE()
            {
             SerialNumber = new byte[16];
             Description = new byte[64];
            }
        }
Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
31. 5. 2016   #6
-
0
-

#5 BDS

public uint ftHandle; // tady to asi bude ukazatel..

si mi nasadil brouka do hlavy. Jestli by tam nemělo být IntPtr nebo něco podobného... Se musím zítra podívat jak to měli FTDI u příkladů k již nepodporované FTCSPI

hu
 

Nahlásit jako SPAM
IP: 193.86.81.–
BDS+3
Věrný člen
31. 5. 2016   #7
-
0
-

#6 hlucheucho
to je asi jedno, to můžeš vyřešit přetypováním. To už podle toho na co to má ukazovat.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Řešení
BDS+3
Věrný člen
31. 5. 2016   #8
-
0
-
Vyřešeno Nejlepší odpověď

Teď jsem si zkusil pracovat s podobnou strukturou. Funkční je to takto: 

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct FT_DEVICE_LIST_INFO_NODE
    {
        public uint Flags;
        public uint Type;
        public uint ID;
        public uint LocID;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public byte[] SerialNumber; //pokud je to unicode tak, char
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
        public byte[] Description; // -||-
        public uint ftHandle; // tady to asi bude ukazatel..
    }

funkci to předávej přes ref

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Dotaz — založil Filip

Dotau — založil kadla

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý