目前我正在处理我必须扩展的现有项目(DLL)。
对于通过DLL的传输,我有一个结构,例如' ExternEntry' 以及传递数组的结构。
struct ExternEntry
{
unsigned int MyInt;
const wchar_t* Text;
}
struct ExternEntries
{
const ExternEntry* Data;
const unsigned int Length;
ExternEntries(const ExternEntry* ptr, const unsigned int size)
: Data(ptr)
, Length(size);
{
}
}
在现有的项目架构中,这将是第一次将数组传递给DLL调用者。所以现有的体系结构不允许数组,如果将结构传递给调用者,通常会有一个包装器结构(因为它们的str指针)。
在DLL内部,我需要包装ExternEntry,以便有一个有效的文本指针。
struct InternEntry
{
ExternEntry Data;
std::wstring Text;
inline const ExternEntry* operator&() const { return& Data }
UpdateText() { Data.Text = Text.c_str(); }
}
struct InternEntries
{
std::vector<InternEntry> Data;
operator ExternEntries() const
{
return ExternEntries(Data.data()->operator&(), Data.size());
}
}
所以问题是,当调用者收到ExternEntries并再次创建一个向量时:
auto container = DllFuncReturnInternEntries(); // returns ExternEntries
std::vector<ExternEntry> v(container.Data, container.Data + container.Length);
第一个元素有效。所有其他元素都指向错误的内存,因为在内存中,InternEntry(带有wstring Text)存储在下一个InternEntry之间。
也许我错误的原因是它无法正常工作。
[Data][std::wstring][Data][std::wstring][Data][std::wstring]
来电者知道[数据]的大小 因此,向量正在执行以下操作:
[Data][std::wstring][Data][std::wstring][Data][std::wstring]
| | |
Get Get Get
而不是
[Data][std::wstring][Data][std::wstring][Data][std::wstring]
| | |
Get Get Get
我是否有可能自定义向量如何在内存中存储InternEntry对象? 像数据,数据,数据..其他地方wstring,wstring,wstring
我希望我能很好地解释我的问题