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生ポインタの配列を返すことができます。コンポーネントが異なるランタイム ライブラリを使用しており、別のアロケーターで割り当てられたものを使用できないため、使用しないでください。とを使用すると、プロセス全体で共有される Win32 標準アロケータを使用できます。foo*HeapAllocmalloc()free()HeapAllocHeapFree

例として、次のようなことができます。

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 に答える