Avatar billede brian0905 Nybegynder
18. juli 2008 - 11:42 Der er 12 kommentarer

Oversætte C++ Struct til C#

Hejsa,
Jeg laver noget IPC mellem en C++ applikation og min managed C# applikation. Jeg sender en struct fra C++ til C#, men en del af teksten bliver det rene volapyk. C++ struck ser således ud:

struct GAME_TEXT
{
    int Venue;
    HWND Window;
    wchar_t Text[255];
};

Det er den wchar_t variabel der driller, hvad skal den oversættes til? Jeg har forsøge med en string, men det giver mig bare en masse symboler der ligner windings text...
Avatar billede aaberg Nybegynder
18. juli 2008 - 12:04 #1
DllImport attributten har en CharSet property. Jeg vil tro at det er den du skal eksperimentere lidt med.

[DllImport("myUnmanagedAssembly.dll", CharSet=CharSet.Auto)]
Avatar billede brian0905 Nybegynder
18. juli 2008 - 12:54 #2
Jeg tror du misforstår. Jeg for en pointer ind i mit program (via en COPYDATASTRUCT, WM_COPYDATA), og skal loade data for den pointer. Jeg har nu lavet min egen struct der ser således ud:

public struct GAMETEXT
{
  public int Venue;
  public IntPtr Window;
  public string Text;
}

den hiver jeg så ind fra min overloadede winproc og skal sætte den til min egen struct:

GAMETEXT mySTruct = (GAMETEXT)Marshal.PtrToStructure(mypointer);

problemet er at text attributten er helt ulæselig, det ligner windings... jeg ved ikke hvilken datatype det ellers skal være, eller hvordan den bliver konverteret til læselig string....

}
Avatar billede driis Nybegynder
18. juli 2008 - 13:10 #3
Du kan med attributter give Marshal funktionen et hint om, hvad for noget data den skal forvente.

Umiddelbart vil jeg tror du skal bruge:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst =  255)]
public string Text;

Hvis det ikke virker, så se her om der findes en UnmanagedType værdi som giver bedre mening i forhold til det data du har i C++:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype.aspx
Avatar billede aaberg Nybegynder
18. juli 2008 - 13:19 #4
prøv:

public struct GAMETEXT
{
  public int Venue;
  public IntPtr Window;

  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
  public string Text;
}
Avatar billede aaberg Nybegynder
18. juli 2008 - 13:19 #5
Ehh, der driis mig i forkøbet!

:-D
Avatar billede aaberg Nybegynder
18. juli 2008 - 13:53 #6
Jeg prøver selvfølgelig at sige: der KOM driis mig i forkøbet!

Tastaturspasmer!
Avatar billede brian0905 Nybegynder
18. juli 2008 - 15:28 #7
Det ser bedre ud nu, men jeg får så kun den første karakter af den string jeg sender over...
Avatar billede driis Nybegynder
18. juli 2008 - 16:14 #8
Prøv lige med LPTStr i stedet, så :-)
Avatar billede brian0905 Nybegynder
19. juli 2008 - 12:25 #9
Så fangede jeg den, det var fordi at hvert andet felt i min string var et \0, dvs, min string troede den sluttede der (null terminated). Jeg har fikset det ved at lave typen således:

public struct GAME_TEXT
        {
            public int Venue;
            public IntPtr Window;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=255)]
            public char[] Text;
        }

og så efterfølgende lavet en funktion der kunne oversætte det til en string:

private string ConvertCharArray(char[] input)
        {
            StringBuilder builder = new StringBuilder();
            foreach (char letter in input)
            {
                if (letter != '\0')
                {
                    builder.Append(letter);
                }
            }
            return builder.ToString();
        }

Give lige et svar alle
Avatar billede md_craig Nybegynder
29. juli 2008 - 14:03 #10
o.O...

private string ConvertCharArray(char[] input)
{
  return new string(input);
}
Avatar billede md_craig Nybegynder
29. juli 2008 - 14:08 #11
ups... hvis de "\0" skal væk, så:
new string(x).Replace("\0","");

men det ville nok være bedre at få den konveret korekt efter encoding frem for at frasortere ting... men bare mig
Avatar billede md_craig Nybegynder
29. juli 2008 - 14:15 #12
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