2

在一个 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*. 有谁知道为什么我无法正确传回向量?我在选角方面做错了吗?

谢谢

4

1 回答 1

4

因为标准库数据结构如std::vector在头文件中实现,实际数据表示在编译器版本之间可能不同。如果你有一些用 VS2005 编译的代码和用 VS2010 编译的其他代码,你不能std::vector以这种方式可靠地返回 a。

假设foo组件之间的数据布局完全相同,您可以返回一个foo*已分配的原始指针数组HeapAlloc。不要malloc()再次使用,因为您的组件正在使用不同的运行时库,并且您不能free()使用不同的分配器分配的东西。通过使用HeapAllocand 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);
于 2012-06-21T04:40:20.293 回答