Проблема в следующем: У меня есть COM сервер, у которого есть функция, принимающая один параметр — массив вариантов (STDMETHODIMP)TSampleCOMSvrImpl::SampleFunction(TVariantInParam vArray)
{
return S_OK;
}
и есть клиент который периодически вызывает эту функцию: TCOMISampleCOMSvr g_Svr;
void __stdcall Test()
{
Variant V(OPENARRAY(int, 64*1024 — 1), varByte);
LPVOID p = V.ArrayLock();
// запролняю массив
V.ArrayUnlock();
g_Svr->SampleFunction(V);
}
Все замечательно работает, только вот диспетчер задач показывает, что на клиенте постоянная утечка памяти (т.е. с каждой минутой работы памяти клиенту требуется все больше и больше), через несколько часов работы виндовоз начинает кричать об отсутствии места в файле подкачки. Если же строку с вызовом g_Svr->SampleFunction(V); закоментировать, то ничего подобного не происходит. Кто знает, как бороться с этой проблемой? Помогите.
Заранее благодарен.
Здравствуйте Андрей А. Тельнов, Вы писали:
ААТ>Проблема в следующем: У меня есть COM сервер, у которого есть функция, принимающая один параметр — массив вариантов (STDMETHODIMP)TSampleCOMSvrImpl::SampleFunction(TVariantInParam vArray) ААТ>{ ААТ> return S_OK; ААТ>} ААТ>и есть клиент который периодически вызывает эту функцию: TCOMISampleCOMSvr g_Svr; ААТ>void __stdcall Test() ААТ>{ ААТ> Variant V(OPENARRAY(int, 64*1024 — 1), varByte); ААТ> LPVOID p = V.ArrayLock(); ААТ> // запролняю массив ААТ> V.ArrayUnlock(); ААТ> g_Svr->SampleFunction(V); ААТ>} ААТ>Все замечательно работает, только вот диспетчер задач показывает, что на клиенте постоянная утечка памяти (т.е. с каждой минутой работы памяти клиенту требуется все больше и больше), через несколько часов работы виндовоз начинает кричать об отсутствии места в файле подкачки. Если же строку с вызовом g_Svr->SampleFunction(V); закоментировать, то ничего подобного не происходит. Кто знает, как бороться с этой проблемой? Помогите. ААТ>Заранее благодарен.
Вообще то я не уверен, но может попробовать отчищать вариант после того как вызов завершен....
в мсдн вроде есть такая функция
HRESULT VariantClear(VARIANT * pv);.....................
Здравствуйте Bai, Вы писали:
Bai>Вообще то я не уверен, но может попробовать отчищать вариант после того как вызов завершен.... Bai>в мсдн вроде есть такая функция Bai>HRESULT VariantClear(VARIANT * pv);.....................
Здравствуйте Андрей А. Тельнов, Вы писали:
ААТ>Здравствуйте Bai, Вы писали:
Bai>>Вообще то я не уверен, но может попробовать отчищать вариант после того как вызов завершен.... Bai>>в мсдн вроде есть такая функция Bai>>HRESULT VariantClear(VARIANT * pv);.....................
ААТ>Не помогает. Но все равно спасибо.
Ну тогда может лучше массивы предавать с помощью SAFEARRAY
с ним все работает нормально...........
Re[4]: Передача массивов в DCOM
От:
Аноним
Дата:
17.04.02 06:10
Оценка:
Здравствуйте Bai, Вы писали:
Bai>Ну тогда может лучше массивы предавать с помощью SAFEARRAY Bai>с ним все работает нормально...........
Жутко неудобно, но, действительно работает.
Еще раз спасибо.