C++ till C#

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

C++ till C#

Inlägg 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 
} 
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg 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 
          } 
      }
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg 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 ?
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg 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.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg 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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Inlägg 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
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg 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
Skriv svar