Передача массивов в DCOM
От: Андрей А. Тельнов  
Дата: 16.04.02 23:04
Оценка:
Проблема в следующем: У меня есть 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); закоментировать, то ничего подобного не происходит. Кто знает, как бороться с этой проблемой? Помогите.
Заранее благодарен.
Re: Передача массивов в DCOM
От: Bai  
Дата: 17.04.02 04:06
Оценка:
Здравствуйте Андрей А. Тельнов, Вы писали:

ААТ>Проблема в следующем: У меня есть 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);.....................

результат не гарантирую но попробовать можно..
Re[2]: Передача массивов в DCOM
От: Андрей А. Тельнов  
Дата: 17.04.02 04:42
Оценка:
Здравствуйте Bai, Вы писали:

Bai>Вообще то я не уверен, но может попробовать отчищать вариант после того как вызов завершен....

Bai>в мсдн вроде есть такая функция
Bai>HRESULT VariantClear(VARIANT * pv);.....................

Не помогает. Но все равно спасибо.
Re[3]: Передача массивов в DCOM
От: Bai  
Дата: 17.04.02 04:56
Оценка:
Здравствуйте Андрей А. Тельнов, Вы писали:

ААТ>Здравствуйте Bai, Вы писали:


Bai>>Вообще то я не уверен, но может попробовать отчищать вариант после того как вызов завершен....

Bai>>в мсдн вроде есть такая функция
Bai>>HRESULT VariantClear(VARIANT * pv);.....................

ААТ>Не помогает. Но все равно спасибо.


Ну тогда может лучше массивы предавать с помощью SAFEARRAY
с ним все работает нормально...........
Re[4]: Передача массивов в DCOM
От: Аноним  
Дата: 17.04.02 06:10
Оценка:
Здравствуйте Bai, Вы писали:

Bai>Ну тогда может лучше массивы предавать с помощью SAFEARRAY

Bai>с ним все работает нормально...........

Жутко неудобно, но, действительно работает.
Еще раз спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.