Anzeige:
Ergebnis 1 bis 6 von 6

Thema: C++ DLL Übergabeparameter

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.04.2006
    Beiträge
    13

    Question C++ DLL Übergabeparameter

    Hi,

    wir entwickeln gerade in C++ eine DLL, die unter C# und evtl. VB 6.0 eingebunden werden soll.

    Jetzt benutzen wir z.B. in C++ eine map welchen vergleichbaren Datentyp kann ich dann von VB bzw. C# an die Funktion in der DLL übergeben?

    Gibt es bestimme Regeln bzw. eine Liste mit den gängigen Übergabeparameter für eine DLL?

    Vielen Dank, Marco

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Normalerweise kann man über DLLs nur Funktionen mit einer C-Signatur einbinden.
    In C++ muss man dazu der Funktionsdeklaration ein extern "C" voranstellen und darf dann als Parameter nur C-Datentypen verwenden.
    C++-Funktionen müssen dann in ein C-Interface gekapselt werden.

  3. #3
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Das stimmt IMHO so nicht ganz.

    1. Das "extern "C"" bestimmt lediglich, wie der Name der Funktion in der DLL hinterlegt wird. Heißt die Routine z.B. "test", dann wird mit "extern "C"" diese Routine als "test" exportiert, ohne "extern "C"" wird der Name hingegen so kodiert, daß die Typen der Parameter stimmen müssen, also z.B. "?test@@YAHPAUresult@@PAX@Z".

    2. Übergeben kann man grundsätzlich alles, egal ob "extern "C"" oder nicht, auch Referenzen etc. Die Gegenseite muß es aber verstehen können. D.h. grundsätzlich kann man z.B. auch einen Pointer auf eine map übergeben, allerdings muß die Gegenseite logischerweise das Format der "map" Struktur kennen, um auf die einzelnen Elemente richtig zugreifen zu können.

    Wandelt man also zwischen den Sprachen, muß man schauen, was beide Sprachen können und gleich kodieren. Normalerweile läuft dies darauf hinaus, daß nur Integer-Werte oder Zeiger auf wohl- oder selbstdefinierte Strukturen sinnvoll einzusetzen sind. Und selbst bei Strukturen muß man auf das richtige "Padding" (also die Ausrichtung der einzelnen Elemente an Byte, Wort oder Langwort-Grenzen) achten, die MS-Compiler stellen dafür das Compiler-Pragma "pack" zur Verfügung.

    Wie nun in deinem konkreten Fall die "map" übergeben? Wie wäre es als Text im XML-Format? Dazu muß die map zwar im C++-Teil kodiert und in der DLL decodiert werden, aber dafür wäre man so recht sprachunabhängig.

  4. #4
    Registrierter Benutzer
    Registriert seit
    12.04.2006
    Beiträge
    13

    Question

    Hi,

    wenn es nicht unbedingt sein muss, das ganze per xml zu lösen würde ich es gerne vermeiden, auch wenn ich dann nicht so unabhängig bin.

    Vielleicht mal ehr so gefragt, wenn meine Funktion in C++ so aussieht:

    Code:
    __declspec( dllexport ) float  _stdcall myFunktion(map<string, float>& myValues);
     
    float _stdcall myFunktion(map<string, float>& myValues)
    {
       return myValues["myValue_01"];
    }
    wie könnte ich in C# eine entsprechende map an die DLL übergeben? Von C# habe ich leider so gut wie keine Ahnung und das Problem wäre vielleicht gelöst wenn ich wüsste wie dasfunktioniert.

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Ich würde vorschlagen, das was du machen willst mit einer anderen Datenstruktur abzubilden, z.b. indem du 2 string-arrays übergibst.
    Wie man die in C# erzeugt kann ich dir auch nicht sagen, aber es ist sicher einfacher als sich mit der exakten Struktur von std::map auszusetzen, die ja für jede Template-Instantiierung anders sein kann.

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.04.2006
    Beiträge
    13

    Thumbs up

    Vielen Dank für die Hilfe, ich habe es jetzt mit einem Array gelöst.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •