2 Stimmen

casting void pointer über dll

In einer Mülltonne mache ich

std::vector<foo*>* v = new std::vector<foo*>();
foo* f = new foo();
v->push_back(f);
// size of v is 1
process->Result = static_cast<void*>(v);  // Result is of type void*

und in einer Exe, die die DLL verwendet, mache ich

if (process->Result != NULL)
{
   std::vector<foo*>* v = static_cast<std::vector<foo*>*>(process->Result);
   int size = v->size(); // <-- size is garbage (221232 or something like that)   

}

Das Ergebnis muss ein void* . Weiß jemand, warum ich den Vektor nicht richtig zurückgeben kann? Mache ich etwas falsch mit dem Guss?

Danke

4voto

Greg Hewgill Punkte 882617

Da die Datenstrukturen der Standardbibliothek, wie z.B. std::vector in Header-Dateien implementiert sind, kann die tatsächliche Datendarstellung in den verschiedenen Versionen des Compilers unterschiedlich sein. Wenn Sie einigen Code mit VS2005 und anderen Code mit VS2010 kompiliert haben, können Sie nicht zuverlässig eine std::vector auf diese Weise.

Angenommen, foo genau das gleiche Datenlayout zwischen den Komponenten ist, können Sie ein Array von Rohdaten zurückgeben foo* Zeigern, die mit HeapAlloc . Nicht verwenden malloc() denn auch hier verwenden Ihre Komponenten unterschiedliche Laufzeitbibliotheken und Sie können nicht free() etwas, das mit einem anderen Zuweiser zugewiesen wurde. Durch die Verwendung von HeapAlloc y HeapFree verwenden Sie den Win32-Standard-Allokator, der von Ihrem gesamten Prozess gemeinsam genutzt wird.

Sie könnten zum Beispiel so etwas tun wie:

v->push_back(f);
HANDLE heap = GetProcessHeap();
foo **r = (foo **)HeapAlloc(heap, 0, (v->size() + 1) * sizeof(foo *));
std::copy(v.begin(), v.end(), r);
r[v->size()] = NULL; // add a sentinel so you know where the end of the array is
process->Result = r;

und dann in Ihrem aufrufenden Modul:

foo **v = static_cast<foo**>(process->Result);
for (int i = 0; v[i] != NULL; i++) {
    printf("index %d value %p\n", i, v[i]);
}
HANDLE heap = GetProcessHeap();
HeapFree(heap, 0, v);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X