Я пишу 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;
}