在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*
。有谁知道为什么我无法正确传回矢量?我是否对铸造做错了什么?
谢谢
答案 0 :(得分:4)
由于标准库数据结构(如std::vector
)是在头文件中实现的,因此编译器版本之间的实际数据表示可能不同。如果您使用VS2005编译了一些代码,而使用VS2010编写了其他代码,则无法以这种方式可靠地返回std::vector
。
假设foo
是组件之间完全相同的数据布局,您可以返回已使用HeapAlloc
分配的原始foo*
指针数组。不要使用malloc()
,因为您的组件再次使用不同的运行时库,并且您不能free()
已使用不同分配器分配的内容。通过使用HeapAlloc
和HeapFree
,您使用的是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);