Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨dll强制转换空指针_C++_Dll_Casting - Fatal编程技术网

C++ 跨dll强制转换空指针

C++ 跨dll强制转换空指针,c++,dll,casting,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 != N

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

}
结果必须是一个空*。有人知道为什么我不能正确地传回向量吗?我的演员阵容有问题吗


谢谢

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

假设foo是组件之间完全相同的数据布局,则可以返回已分配的原始foo*指针数组。不要使用malloc,因为同样,您的组件正在使用不同的运行时库,并且您无法释放使用不同分配器分配的内容。通过使用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);

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

假设foo是组件之间完全相同的数据布局,则可以返回已分配的原始foo*指针数组。不要使用malloc,因为同样,您的组件正在使用不同的运行时库,并且您无法释放使用不同分配器分配的内容。通过使用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);

两边的地址都一样吗?您是否使用完全相同的运行库和编译选项编译两侧?@GregHewgill两侧的地址相同,但dll是使用vs2005创建的,exe是使用vs2010创建的。对,那肯定不行。由于标准库数据结构(如std::vector)是在头文件中实现的,因此编译器版本之间的实际数据表示形式可能不同。@GregHewgill,谢谢!那么,使用此设置将某个集合从我的dll返回到exe的最佳方法是什么?两侧的地址是否相同?您是否使用完全相同的运行库和编译选项编译两侧?@GregHewgill两侧的地址相同,但dll是使用vs2005创建的,exe是使用vs2010创建的。对,那肯定不行。由于标准库数据结构(如std::vector)是在头文件中实现的,因此编译器版本之间的实际数据表示形式可能不同。@GregHewgill,谢谢!那么,使用此设置将dll中的内容集合返回到exe的最佳方式是什么呢?我从未使用过HeapAlloc。你能用我的问题中的例子来说明它的用法吗,或者给我指一个解释用法的资源。关于std::vector在头文件中的好答案,另请参阅我的问题:,它的答案来自John Dibling。在你的HeapAlloc示例中:为什么简单的数组Foo*[]与int numFoos组合不起作用?当然,所有这些都假定一个Foo类本身可以安全地跨dll边界传输…@Andre:我假设模块之间的接口是一个void*,而不是像整数计数这样的任何东西。如果OP有空间进行计数,那也同样有效。我从未使用过HeapAlloc。你能用我的问题中的例子来说明它的用法吗,或者给我指一个解释用法的资源。关于std::vector在头文件中的好答案,另请参阅我的问题:,它的答案来自John Dibling。在你的HeapAlloc示例中:为什么简单的数组Foo*[]与int numFoos组合不起作用?当然,所有这些都假定一个Foo类本身可以安全地跨dll边界传输…@Andre:我假设模块之间的接口是一个void*,而不是像整数计数这样的任何东西。如果OP有空间进行计数,则同样有效。