在dll上转换void指针

时间:2012-06-21 04:07:34

标签: c++ dll casting

在dll中,我正在做

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*

在使用dll的exe中,我做

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)   

}

结果必须是void*。有谁知道为什么我无法正确传回矢量?我是否对铸造做错了什么?

谢谢

1 个答案:

答案 0 :(得分:4)

由于标准库数据结构(如std::vector)是在头文件中实现的,因此编译器版本之间的实际数据表示可能不同。如果您使用VS2005编译了一些代码,而使用VS2010编写了其他代码,则无法以这种方式可靠地返回std::vector

假设foo是组件之间完全相同的数据布局,您可以返回已使用HeapAlloc分配的原始foo*指针数组。不要使用malloc(),因为您的组件再次使用不同的运行时库,并且您不能free()已使用不同分配器分配的内容。通过使用HeapAllocHeapFree,您使用的是Win32标准分配器,它在整个过程中共享。

举例来说,您可以执行以下操作:

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;

然后在你的调用模块中:

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);