У меня есть COM-объект, который я инициализирую сразу:
ISTIPositionPtr _position;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
_position.CreateInstance(__uuidof(STIPosition));
Далее у меня есть функция, которая вызывает метод этого COM-объекта:
LPSAFEARRAY saValues;
structSTIPositionUpdate* pVals;
long count;
float sum = 0;
if (SUCCEEDED(_position->GetPositionList(&saValues, &count))) {
if (SUCCEEDED(SafeArrayAccessData(saValues, (void**)&pVals))) {
for (int i = 0; i < count; ++i) {
sum += pVals[i].fDollarsBot;
}
SafeArrayUnaccessData(saValues);
}
SafeArrayDestroy(saValues);
}
return sum;
Проблема в том, что метод:
_position->GetPositionList(&saValues, &count)
Верните правильное значение или ноль. но если я вызываю функцию с интервалами паузы, то все работает нормально. Я не знаю, возможно, это асинхронный метод, и я должен использовать некоторые механизмы, которые ждут, пока метод будет завершен?
Например:
long count = 0;
while (count == 0) {
_position->GetPositionList(&saValues, &count)
}
Я обнаружил, что нужно инициализировать saValues:
LPSAFEARRAY saValues = NULL;
и тогда все работает как положено.
Других решений пока нет …