Я пишу XLL (используя библиотеку XLW), которая вызывает функцию DLL. Эта функция DLL получит ссылку на вектор, изменит вектор и вернет его по аргументу.
У меня есть решение VS10 с несколькими проектами C++, некоторыми библиотеками DLL и XLL, которые будут вызывать функции DLL из Excel. Я скомпилировал все с помощью компилятора VS10 с _HAS_ITERATOR_DEBUGGING=0
и _CRT_SECURE_NO_WARNINGS
и использовал одну и ту же библиотеку времени выполнения (/MDd) для всех проектов.
Мне также пришлось пересобрать библиотеку XLW, чтобы она соответствовала _HAS_ITERATOR_DEBUGGING=0
, которую я должен использовать в своих проектах.
При вызове xll_function я получал ошибки Heap Corruption и не мог понять, почему. После того, как я попытался изменить размер моего вектора перед вызовом функции dll, ошибка исчезла. То есть я могу вызвать функцию и получить правильный вектор, возвращаемый аргументом, без повреждений кучи.
Может ли кто-нибудь пролить свет на это? Поскольку я новичок в использовании DLL, я не уверен, должно ли это происходить или я делаю что-то не так.
Как вы можете видеть в приведенном ниже коде, функция dll попытается изменить размер forwards
, и это то, что, как я думаю, генерирует ошибки кучи. Я пытаюсь понять, почему это происходит и как это изменение размера и распределения работает для dll. Возможно, я не могу изменить размер вектора, выделенного в другой куче.
** Код ниже — первая функция является статическим методом в классе из проекта dll, а вторая функция экспортируется в XLL.
void dll_function(double quote, const std::vector<double>& drift, const std::vector<double>& divs, std::vector<double>& forwards)
{
size_t size = drift.size();
forwards.resize(size);
for( size_t t = 0; t < size; t++)
{
forwards[t] = (quote - divs[t]) * drift[t];
}
}
MyArray xll_function(double quote, const MyArray& drift, const MyArray& divs)
{
// Resizing the vector before passing to function
std::vector<double> forwards(drift.size());
dll_function(quote, drift, divs, forwards);
return forwards;
}