Sida 1 av 1
C++ till C#
Postat: 11 april 2008, 19:57:33
av thepirateboy
Någon som är bra på C# och kan översätta följande kod, som antagligen är C++. Framförallt pekare till buffrarna jag tänker på.
Kod: Markera allt
char *BufPtrs[3]; // pointer to array of 3 pointers
char Buffer1[64]; // buffer for description of first device
char Buffer2[64]; // buffer for description of second device
// initialize the array of pointers
BufPtrs[0] = Buffer1;
BufPtrs[1] = Buffer2;
BufPtrs[2] = NULL; // last entry should be NULL
ftStatus = FT_ListDevices(BufPtrs,&numDevs,FT_LIST_ALL|FT_OPEN_BY_DESCRIPTION);
if (ftStatus == FT_OK) {
// FT_ListDevices OK, product descriptions are in Buffer1 and Buffer2, and
// numDevs contains the number of devices connected
}
else {
// FT_ListDevices failed
}
Postat: 11 april 2008, 20:53:56
av Micke_s
Detta ska nog funka. Du kanske måste slå på unsafe i kompileringen bara.
Kod: Markera allt
unsafe
{
char*[] BufPtrs; // pointer to array of 3 pointers
char* Buffer1 = stackalloc char[64];
char* Buffer2 = stackalloc char[64];
// initialize the array of pointers
BufPtrs[0] = Buffer1;
BufPtrs[1] = Buffer2;
BufPtrs[2] = null; // last entry should be NULL
ftStatus = FT_ListDevices(BufPtrs, &numDevs, FT_LIST_ALL | FT_OPEN_BY_DESCRIPTION);
if (ftStatus == FT_OK)
{
// FT_ListDevices OK, product descriptions are in Buffer1 and Buffer2, and
// numDevs contains the number of devices connected
}
else
{
// FT_ListDevices failed
}
}
Postat: 12 april 2008, 10:53:50
av thepirateboy
Tackar, det gick igenom kompileringen efter ett par små ändringar. Men jag får inte tillbaka någon "product descriptions" på de anslutna USB-enheterna hur än jag gör. "number of devices connected " funkar klockrent.
Ska testa om
FT_GetDeviceInfoDetail fungerar bättre, eller är det någon som har fungerande C#-kod att dela med sig av som använder med D2XX.dll ?
Postat: 12 april 2008, 11:37:50
av Micke_s
Kollat på
http://www.ftdichip.com/Projects/CodeEx ... CSharp.htm
C# version of D2XXAccess for Windows CE borde kunna användas i vanliga fall typ.
Postat: 12 april 2008, 11:45:36
av thepirateboy
Ja, det är det jag utgått från. Men jag ska göra ett nytt försök idag nu när jag sovit ut.
Postat: 13 april 2008, 11:34:33
av johano
För att göra detta med P/Invoke kan du passa parametern som IntPtr[], detta kommer motsvara void**.
Du måste deklarera funktionen som extern static i en klass och sedan dekorera med attributet DllImport() precis som vanligt.
Kod: Markera allt
using System.Runtime.InteropServices;
...
class TheDll
{
[DllImport("TheDll.dll")]
public extern static int FT_ListDevices( IntPtr[] pbuffers, ref int numbuffers, int flags);
}
Och sedan för att använda funktionen kan det se ut såhär t.ex.:
Kod: Markera allt
...
IntPtr[] buffer = new IntPtr[3];
buffer[0] = Marshal.AllocHGlobal(64);
buffer[1] = Marshal.AllocHGlobal(64);
buffer[2] = IntPtr.Zero;
int numbuf = 0;
int status = TheDll.FT_ListDevices( buffer, ref numbuf, 0);
// retrieve contents into 2 byte[]
byte[] buf1 = new byte[64];
byte[] buf2 = new byte[64];
Marshal.Copy(buffer[0], buf1, 0, 64);
Marshal.Copy(buffer[1], buf2, 0, 64);
Marshal.FreeHGlobal(buffer[0]);
Marshal.FreeHGlobal(buffer[1]);
...
/johan
Edit: lade till null-terminering av buffer
Postat: 6 maj 2008, 21:14:02
av thepirateboy
Jag la ner det där och köpte Smileys bok och källkod istället, även om det säkert gått med lite tålamod.
Källkod
Kastade snabbt ihop ett program, verkar fungera bra.
FTDI-test