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