Problem beim DLL-Aufruf

Michbeck1983

Mitglied
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:
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?
 
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
 
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.
 
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 :)).
 
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 :)
 
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.
 
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);
 
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.
 
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.
 
Zurück