tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von realbora
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
731
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    realbora realbora ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    23
    Hallo,

    kann mir jemand sagen, wie ich in cpp ein array als rückgabe hinbekomme. Ziel ist es eine dll in cpp zu schreiben und diese möchte ich dann in .net mittels p/invoke einbinden. Anschließend rufe ich eine Methode auf und erwarte (eigentlich) nen Array als Rückgabe. Leider funktioniert das bei mir nich so gut, da ich immer nur die ersten zwei Stellen des Strings/Arrayindex bekomme (ohne \0).

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    char* List_NetworkAdapter[256];
    extern "C" __declspec(dllexport) void* getNetworkAdapter()
    {
        /*for (int i = 0; i < 256; i++)
        {
            List_NetworkAdapter[i] = (string)malloc(sizeof(char)*256);
        }*/
     
        List_NetworkAdapter[0] = "1234567890";
        List_NetworkAdapter[1] = "67890";
     
            return List_NetworkAdapter;
    }

    Wenn ich diese Methode von extern aufrufe, dann bekomme ich bei Arrayindex 0 --> "12"
    und bei Arrayindex 1 --> "67" aber mehr nicht. Woran kann das liegen? Habe ich evtl. nicht genug bzw. explizit kein speicher allokiert oder...?

    mfG
     

  2. #2
    realbora realbora ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    23
    Lösung über Referenz-Parameter gefunden:

    CPP-CODE:
    Code :
    1
    2
    3
    4
    5
    6
    
    extern "C" __declspec(dllexport) void getNetworkAdapter(char** strings)
    {
        strings[0] = "123456";
        strings[1] = "6789012";
        strings[2] = "5644563454445";
    }

    C#-CODE
    Code :
    1
    2
    
            [DllImport("CPP.dll", EntryPoint = "getNetworkAdapter", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
            static extern void getNetworkAdapter([Out, MarshalAs(UnmanagedType.LPArray)] String[] strings);
    memento_ bedankt sich. 

  3. #3
    realbora realbora ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    23
    Eine zweite Lösung von MS:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    extern "C" __declspec(dllexport) void getNetworkAdapter(char* strings[])
    {
        string* strArr = new string[10];
        strArr[0] = "123456";
        strArr[1] = "adsbakbd";
        strArr[2] = "98774";
        for( int i = 0; i < strArr->length(); i++ )
        {
            if (strArr[i].length() == 0)
                continue;
     
            STRSAFE_LPWSTR temp;
            temp = (STRSAFE_LPWSTR)CoTaskMemAlloc( sizeof(char) * 10 );
            StringCchCopy( temp, sizeof(temp), (STRSAFE_LPWSTR)strArr[i].c_str() );
     
            // CoTaskMemFree must be used instead of delete to free memory.
            CoTaskMemFree( strings[ i ] );
            strings[ i ] = (char *) temp;
        }
    }

    Die erste Lösung ist aber, glaube ich, wesentlich übersichtlicher.
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 03.08.08, 15:26
  2. Elemente eines Arrays
    Von Juhubuntu im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 16.07.08, 19:55
  3. Sortierung eines Arrays
    Von styri im Forum PHP
    Antworten: 2
    Letzter Beitrag: 18.05.07, 15:22
  4. Return eines SELECT COUNT(*)
    Von DaRealMC im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.12.05, 13:23
  5. Maximum eines Arrays
    Von janosch im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.01.05, 21:04