sellerie2001
Grünschnabel
Hi,
ich programmiere unter der MFC an einer DLL, welche Messwerte (die irgendwoher stammen) nach verschiedenen Algorithmen (mit verschiedenen Funktionen) umrechnet. Die einzelnen Funktionen werden über eine Wrapperfunktion mit fester Parameterliste, die innerhalb der DLL, als extern deklariert, implementiert ist. Die DLL und die Wrapperfunktion sind nötig, da nicht nach jedem Zufügen einer neuen Messwertbearbeitungsfunktion, das Hauptprogramm, welches die DLL läd, erneut gelinkt werden muss.
Die Messwerte sind in einer Klasse gespeichert, die sowohl in der Hauptanwendung, als auch in der DLL deklariert und implementiert ist.
Mein Problem ist folgendes:
Ich übergebe die Messwertklassen (variable Anzahl an Klassen mit variabler Anzahl an Messwerten) als Zeiger auf einen Vektor aus void* Elementen (void*, da es verschiedene Messwerttypen in unterschiedlichen Klassen gibt) an die Wrapperfunktion der DLL. Allerdings enthalten die Messwertklassen bei Verwendung in der DLL nur Datenmüll, während sie vorher in der Hauptanwendung einwandfreie Messwerte beeinhalteten.
Es scheint, als ob die DLL den von der Hauptanwendung alloziierten Speicher nicht weiterverwenden kann. Was kann man dagegen tun?
Hauptanwendung:
typedef UINT (CALLBACK* COMHELPER)(DISPID,std::vector<void*>*,const BYTE*, ...);
void rufAuf ()
{
HINSTANCE hInst = LoadLibrary ("Editation.dll");
if (!hInst) return;
COMHELPER pfuncHelper = (COMHELPER) GetProcAddress (hInst, "COMHelper");
if (!pfuncHelper) return;
std::vector<void*>* lpvecMesswerte = GetMesswerte ();
// Z.B.
Messwertklasse *lpMess = (Messwertklasse*) lpvecMesswerte->at (0);
double ldMessDt = lpMess->GetMittelwert (0);
// ldMessDt enthält Werte
pfuncHelper (FUNKTIONSID,lpvecMesswerte,0,NULL);
}
DLL:
EDITATION_API COMHelper (DISPID dispID, std::vector<void*>* pvecValues,
const BYTE* pbParameters, ...)
{
// Z.B.
Messwertklasse *lpMess = (Messwertklasse*) pvecValues->at (0);
double ldMessDt = lpMess->GetMittelwert (0);
// ldMessDt enthält Datenmüll z.B. -2342352
}
ich programmiere unter der MFC an einer DLL, welche Messwerte (die irgendwoher stammen) nach verschiedenen Algorithmen (mit verschiedenen Funktionen) umrechnet. Die einzelnen Funktionen werden über eine Wrapperfunktion mit fester Parameterliste, die innerhalb der DLL, als extern deklariert, implementiert ist. Die DLL und die Wrapperfunktion sind nötig, da nicht nach jedem Zufügen einer neuen Messwertbearbeitungsfunktion, das Hauptprogramm, welches die DLL läd, erneut gelinkt werden muss.
Die Messwerte sind in einer Klasse gespeichert, die sowohl in der Hauptanwendung, als auch in der DLL deklariert und implementiert ist.
Mein Problem ist folgendes:
Ich übergebe die Messwertklassen (variable Anzahl an Klassen mit variabler Anzahl an Messwerten) als Zeiger auf einen Vektor aus void* Elementen (void*, da es verschiedene Messwerttypen in unterschiedlichen Klassen gibt) an die Wrapperfunktion der DLL. Allerdings enthalten die Messwertklassen bei Verwendung in der DLL nur Datenmüll, während sie vorher in der Hauptanwendung einwandfreie Messwerte beeinhalteten.
Es scheint, als ob die DLL den von der Hauptanwendung alloziierten Speicher nicht weiterverwenden kann. Was kann man dagegen tun?
Hauptanwendung:
typedef UINT (CALLBACK* COMHELPER)(DISPID,std::vector<void*>*,const BYTE*, ...);
void rufAuf ()
{
HINSTANCE hInst = LoadLibrary ("Editation.dll");
if (!hInst) return;
COMHELPER pfuncHelper = (COMHELPER) GetProcAddress (hInst, "COMHelper");
if (!pfuncHelper) return;
std::vector<void*>* lpvecMesswerte = GetMesswerte ();
// Z.B.
Messwertklasse *lpMess = (Messwertklasse*) lpvecMesswerte->at (0);
double ldMessDt = lpMess->GetMittelwert (0);
// ldMessDt enthält Werte
pfuncHelper (FUNKTIONSID,lpvecMesswerte,0,NULL);
}
DLL:
EDITATION_API COMHelper (DISPID dispID, std::vector<void*>* pvecValues,
const BYTE* pbParameters, ...)
{
// Z.B.
Messwertklasse *lpMess = (Messwertklasse*) pvecValues->at (0);
double ldMessDt = lpMess->GetMittelwert (0);
// ldMessDt enthält Datenmüll z.B. -2342352
}