tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
615
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Michbeck1983 Michbeck1983 ist offline Mitglied
    Registriert seit
    Dec 2004
    Beiträge
    22
    Hallo,

    ich habe folfendes Problem: Ich möchte aus einer DLL heraus eine Funktion aufrufen. Die Funktion erwartet eine Referenz auf ein CStringArray und einen Integer.

    Hier mal mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    LPFNDLLFUNC lpfnDllFunc;
       
        lpfnDllFunc = (LPFNDLLFUNC) GetProcAddress(m_SortDll, "Quicksort");
       
         if (!lpfnDllFunc)
         {
         FreeLibrary(m_SortDll);
         AfxMessageBox("Error getting handle to the function");
         break;
         }
          else
          {
        lpfnDllFunc(stringArray, m_NumbDatas);
         }

    Beim Kompilieren bekomme ich den Fehler: "Konvertierung des Parameters 1 von CStringArray nach CStringArray nicht möglich"? Was kann ich darunter verstehen?
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Zeig mal die Definition von LPFNDLLFUNC und von stringArray.
     

  3. #3
    Michbeck1983 Michbeck1983 ist offline Mitglied
    Registriert seit
    Dec 2004
    Beiträge
    22
    Die Definition von stringArray ist einfach nur:

    CStringArray stringArray;

    Die Definition von LPFNDLLFUNC:

    typedef void (CALLBACK* LPFNDLLFUNC) (CStringArray, int);

    Ich muss zugeben: das CALLBACK* habe ich aus der MSDN abgeschrieben, weil es das erste mal ist dass ich mit DLLs arbeite... liegt es etwa an dem
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Hihi, das ist witzisch. Das hat irgendwas mit einem expliziten Constructor zu tun (sag ich mal einfach so, das klingt schlau), das kriegt der Compiler nicht gebacken.
    Da musst du deine Funktionsdefinition ändern:

    Wenn du das CStringArray in der Funktion ändern willst, und die Änderungen nach aussen sichtbar sein sollen, dann mach:

    typedef void (CALLBACK* LPFNDLLFUNC) (CStringArray&, int);

    ansonsten:

    typedef void (CALLBACK* LPFNDLLFUNC) ( const CStringArray&, int);


    Das musst du auch in der DLL abändern.
     

  5. #5
    Avatar von jokey2
    jokey2 jokey2 ist offline Mitglied Smaragd
    Registriert seit
    Nov 2004
    Beiträge
    1.235
    Oder Du mußt für CStringArray einen Kopierkonstruktor schreiben. Dazu wirst Du Dir allerdings eine eigene Klasse von CStringArray ableiten müssen (Wenn Du nicht die MFC-Dateien abändern willst ).
     

  6. #6
    Michbeck1983 Michbeck1983 ist offline Mitglied
    Registriert seit
    Dec 2004
    Beiträge
    22
    Ich krieg die Krise - das hat das Problem gelöst

    Habe einfach bei
    typedef void (CALLBACK* LPFNDLLFUNC) (CStringArray, int);

    ein "&" dazugeschrieben, wie Endurion es gemeint hat, also
    typedef void (CALLBACK* LPFNDLLFUNC) (CStringArray&, int);

    Und jetzt gehts Dankeschön Was so ein einzelnes Zeichen so alles bewirkt
     

  7. #7
    Avatar von jokey2
    jokey2 jokey2 ist offline Mitglied Smaragd
    Registriert seit
    Nov 2004
    Beiträge
    1.235
    Das liegt einfach daran:
    Wenn Du es auf Deine vorherige Weise machst (ohne &), dann versucht der Compiler beim Aufruf Deiner Funktion ein neues Objekt der Klasse CStringArray mit den Werten des übergebenen Objektes anzulegen. Dazu braucht er einen Kopierkonstruktor.
    Wenn Du es auf Endurions Weise machst, dann übergibt er nur eine Referenz auf das vorhandene CStringArray-Objekt. Da braucht er natürlich keinen Kopierkonstruktor. Du mußt allerdings beachten, daß das übergebene Objekt dann in Deiner DLL-Funktion verändert werden kann.
     

  8. #8
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Ah, gut, eine Erklärung. Dann hänge ich noch einen dran, wenn du das Objekt nicht verändern willst, sondern nur auslesen, dann mach wie oben erwähnt ein const vorne dran, so:

    typedef void (CALLBACK* LPFNDLLFUNC) ( const CStringArray&, int);
     

  9. #9
    Michbeck1983 Michbeck1983 ist offline Mitglied
    Registriert seit
    Dec 2004
    Beiträge
    22
    Das ist schon in Ordnung, da in der DLL ein Quicksort-Algorithmus ist, der das CString-Array sortieren soll - also brauche ich auch direkten Zugriff darauf.
     

  10. #10
    Avatar von jokey2
    jokey2 jokey2 ist offline Mitglied Smaragd
    Registriert seit
    Nov 2004
    Beiträge
    1.235
    Dann hätte es mit Deiner ersten Version ja gar nicht klappen können! Wenn Du die übergebene Variable direkt verändern willst, dann mußt du sie immer entweder als Referenz oder einen Zeiger darauf übergeben.
     

  11. #11
    Michbeck1983 Michbeck1983 ist offline Mitglied
    Registriert seit
    Dec 2004
    Beiträge
    22
    Schon klar - die Funktion in der DLL erwartet auch eine Referenz, aber ich hatte ja auch be meiner ersten Version einfach nur das "&"-Zeichen vergessen... Da war ich selber schuld..
     

Ähnliche Themen

  1. Problem beim Aufruf einer Methode mit onresize
    Von Rambomaster im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 02.11.07, 18:34
  2. Parameter Übergabe beim Aufruf
    Von TomSto im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.08.04, 11:45
  3. Fenster beim Aufruf der Seite
    Von timm im Forum HTML & XHTML
    Antworten: 16
    Letzter Beitrag: 25.05.04, 19:59
  4. beim aufruf fehler access
    Von Shooter2k im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 05.09.03, 15:27
  5. Problem beim Aufruf von mysql_connect()
    Von Polymorph im Forum PHP
    Antworten: 2
    Letzter Beitrag: 05.08.03, 20:29