Parameterübergabe von C# an C++ DLL (char *argv[])



  • Hallo,

    ich habe keine Ahnung von C++, muss aber aus C# eine C++ DLL aufrufen, die als Parameter den Typ "char *argv[]" erwartet.

    Hier der C++ teil:

    #define DllExport   __declspec( dllexport )
    DllExport int f_xy(char *params[]);
    
    int f_xy(char *params[])
    {
    ...
    }
    

    Wie kann ich nun aus meinem C# Programm diese C++ Funktion aufrufen und Parameter übergeben?

    Ich suche schon den ganzen Tag bei Google - finde aber leider nix dazu.

    Kann mir jemand helfen?

    Grüße
    Andy



  • Als Einstieg könntest du zum Beispiel folgende Seiten durchstöbern:
    - http://msdn.microsoft.com/de-de/magazine/cc164123(en-us).aspx
    - http://www.pinvoke.net
    - http://www.google.de/search?hl=de&q=c%23+c%2B%2B-dll&btnG=Google-Suche&meta=

    Speziell zu deinem Problem (wobei evtl. das Array Schwierigkeiten machen könnte) probier folgende Deklaration:

    [DllImport("xyz.dll")]
            public static extern int f_xy(string[] params);
    


  • Danke,

    für die Antwort.
    Prinzipiell schon mal nicht schlecht.
    Allerdings erhalte ich in meinen C++ Code immer nur das 1. Zeichen meines Paramter Arrays.
    Beispiel:

    string[] p = new string[2];
    	p[0] = "abcd";
    	p[1] = "1234";
    	f_xy(p);
    	...
    
    int f_xy(char *argv[])
    {
    	char*	param1;
    	char*	param2;
    	argv = &argv[optind];
    	param1 = *argv++;
    	param2 = *argv++;
    	...
    

    param1 hat den Wert "a"
    param2 hat den Wert "1"

    Irgendeine Idee?



  • h

    /edit: eigentlich sollte hier "hups" stehen, da ich mich beim beitrag verlesen hab und somit nur rotz hier stand... hat wohl beim schrieben den fokus verloren 😃



  • Andy01 schrieb:

    Danke,

    für die Antwort.
    Prinzipiell schon mal nicht schlecht.
    Allerdings erhalte ich in meinen C++ Code immer nur das 1. Zeichen meines Paramter Arrays.
    Beispiel:

    string[] p = new string[2];
    	p[0] = "abcd";
    	p[1] = "1234";
    	f_xy(p);
    	...
    
    int f_xy(char *argv[])
    {
    	char*	param1;
    	char*	param2;
    	argv = &argv[optind];
    	param1 = *argv++;
    	param2 = *argv++;
    	...
    

    param1 hat den Wert "a"
    param2 hat den Wert "1"

    Irgendeine Idee?

    Klingt mir nach Null-Bytes innerhalb der einzelnen Zeichen. C# und .NET verwenden ja intern eine Art wchar_t für System.String s, welches breiter ist als char in deinem char *argv[] . Für "normale" Zeichen, sprich dem was mit char dargestellt werden kann werden im wchar_t die nicht gebrauchten Bytes einfach auf null gesetzt (stark vereinfacht gesagt^^). Eventuell wird p für deine Zwecke unbrauchbar gemarshaled (diese Wörter, da kommts mir gleich :p ), anstelle von einem char *[] bekommst du einen wchar_t *[] in deinem C++ Programm, was jedoch vom Compiler nicht bemerkt wird, da der Zeiger zur Laufzeit keinen Typen mehr hat. Du musst das irgendwie gerade biegen, mit einem Interop-Attribut beim Argument der DllImport ierten Funktion... oder so ähnlich - kann es dir leider nicht genauer sagen weil ich sowas noch nie gemacht habe (programmiere ja C++/CLI, brauche ich sowas nicht 😋 )

    pohlmann schrieb:

    h

    Well done, sir! Very well indeed 😋

    MfG



  • Es müsste mit dem CharSet Attribute gehen.



  • hustbaer schrieb:

    Es müsste mit dem CharSet Attribute gehen.

    Richtig. Bei mir hat folgende Einstellung funktioniert:

    [DllImport(DRIVER_DLL_NAME,CharSet=CharSet.Ansi)]
    

Anmelden zum Antworten