Иван Левшин aka Ivan L. писал(а):Попробую проверить... Я просто никогда пакетной отправкой не занимался - мож потому и не замечал.
суть проги такая что в соответствии каталогу поставлен Прокси_юзер, адресат, сабжект, текст боди
за пределы цикла вынесен минимум кода типа логин в GroupWise дефолтовым юзером , а в цикле идем по каталогам и далее в каждом финдфестом ищем файлы (с нормальной маской и ненулевым размером), по нахождению получаем аккаунт проксиюзера и выполняем такую
функцию (блин на Басике раз в 5 меньше текста - на паскалЕ в 2 раза точно ноэ то блин Ц++) писал тучу лет назад проверял всякими отладчиками память не отжирает все что выделяется по мере работы сразу же освобождается.
/* Send Message */
BOOL GWClass::SendMessage(char *Destination,char *Subject,char *Body, char
*AttachFullName)
{
DIGWFolder *pDIGWWorkFolder = NULL;
DIGWMessages *pDIGWMessages = NULL;
DIGWMessage *pDIGWMessage = NULL;
DIGWMessage *pDIGWRetMessage; // just for return value
DIGWFormattedText *pDSubject = NULL;
DIGWFormattedText *pDBody = NULL;
DIGWRecipients *pDIGWRecipients = NULL;
DIGWRecipient *pDIGWRecipient = NULL;
DIGWAttachments* pDIGWAttachments = NULL;
DIGWAttachment* pDIGWAttachment = NULL;
IGWFolder *pIGWWorkFolder = NULL;
IGWMessages *pIGWMessages = NULL;
IGWMessage *pIGWMessage = NULL;
IGWFormattedText *pSubject = NULL;
IGWFormattedText *pBody = NULL;
IGWRecipients *pIGWRecipients = NULL;
IGWRecipient *pIGWRecipient = NULL;
IGWAttachments* pIGWAttachments = NULL;
BSTR bStr ;
HRESULT status, AttachFlag = TRUE;
VARIANT vClass,vType,vTargetType,vVersion,vTo,vEmailType;
// getting workfolder
pIGWAccount->get_WorkFolder(&pDIGWWorkFolder);
// getting interface to workfolder
if( !pDIGWWorkFolder ||
FAILED(pDIGWWorkFolder->QueryInterface(IID_IGWFolder,(LPVOID*)&pIGWWorkFolde
r)))
{
if(pDIGWWorkFolder) pDIGWWorkFolder->Release();
return FALSE;
}
pDIGWWorkFolder->Release();
// getting Messages on workfolder
pIGWWorkFolder->get_Messages(&pDIGWMessages);
// getting interface to Messages
if( !pDIGWMessages ||
FAILED(pDIGWMessages->QueryInterface(IID_IGWMessages,(LPVOID*)&pIGWMessages)
))
{
if(pDIGWMessages) pDIGWMessages->Release();
return FALSE;
}
pDIGWMessages->Release();
// specify class of this message
bStr = SysAllocString(TO_OLE_STRING("GW.MESSAGE.MAIL"));
VariantInit(&vClass);
VariantInit(&vType);
VariantInit(&vVersion);
V_VT(&vClass) = VT_BSTR;
V_VT(&vType) = VT_I4;
V_VT(&vVersion) = VT_EMPTY;
V_BSTR(&vClass) = bStr;
V_I4(&vType) = egwDraft;
// addinf new draft
pIGWMessages->Add(vClass,vType,vVersion,&pDIGWMessage);
SysFreeString(bStr);
// getting interface to draft
if( !pDIGWMessage ||
FAILED(pDIGWMessage->QueryInterface(IID_IGWMessage,(LPVOID
*)&pIGWMessage) ))
{
if(pDIGWMessage) pDIGWMessage->Release();
return FALSE;
}
pDIGWMessage->Release();
// get subject
pIGWMessage->get_Subject(&pDSubject);
// get interface to subject
if(!pDSubject ||
FAILED(pDSubject->QueryInterface(IID_IGWFormattedText,(LPVOID*)&pSubject)))
{
if(pDSubject) pDSubject-> Release();
return FALSE;
}
pDSubject-> Release();
bStr = SysAllocString(TO_OLE_STRING(Subject));
// placing Subject string to subject
pSubject->put_PlainText(bStr);
SysFreeString(bStr);
// get bogy
pIGWMessage->get_BodyText(&pDBody);
// get interface to body
if(!pDBody ||
FAILED(pDBody->QueryInterface(IID_IGWFormattedText,(LPVOID*)&pBody)))
{
if(pDBody) pDBody-> Release();
return FALSE;
}
pDBody-> Release();
bStr = SysAllocString(TO_OLE_STRING(Body));
// placing Body string to body
pBody->put_PlainText(bStr);
// trying insert ViewName - same how Body Text
pIGWMessage->put_ViewName(bStr);
SysFreeString(bStr);
// Insert the attachments to the message
pIGWMessage->get_Attachments(&pDIGWAttachments);
if(pDIGWAttachments &&
SUCCEEDED(pDIGWAttachments->QueryInterface(IID_IGWAttachments,
(void**)&pIGWAttachments)))
{
pDIGWAttachments->Release();
VARIANT vFilename, vType, vDisplayName;
BSTR bFname;
VariantInit(&vFilename);
VariantInit(&vType);
VariantInit(&vDisplayName);
V_VT(&vFilename) = VT_BSTR;
V_VT(&vType) = VT_EMPTY;
V_VT(&vDisplayName) = VT_EMPTY;
bFname = SysAllocString(TO_OLE_STRING(AttachFullName));
V_BSTR(&vFilename) = bFname;
// Add the attachment to the message
if( FAILED(pIGWAttachments->Add(vFilename, vType, vDisplayName,
&pDIGWAttachment)))
AttachFlag = FALSE;
SysFreeString(bFname);
pIGWAttachments->Release();
}
// experimental code !!!
if(pDIGWAttachment) pDIGWAttachment->Release();
//
// get recepients
pIGWMessage->get_Recipients(&pDIGWRecipients);
//get interface to recipients
if( ! pDIGWRecipients ||
FAILED(pDIGWRecipients->QueryInterface(IID_IGWRecipients,(LPVOID*)&pIGWRecip
ients)))
{
if(pDIGWRecipients) pDIGWRecipients->Release();
return FALSE;
}
pDIGWRecipients->Release();
// filling e-mail adress to destination
// filling target type to empty (default) = 0 (0=To, 1=CC, 2=BC)
// filling e-mail address type how "NGW" - groupwise internal
VariantInit(&vTargetType);
VariantInit(&vTo);
VariantInit(&vEmailType);
V_VT(&vTargetType) = VT_EMPTY;
V_VT(&vTo) = VT_BSTR;
V_VT(&vEmailType) = VT_BSTR;
V_BSTR(&vTo) = SysAllocString(TO_OLE_STRING(Destination));
V_BSTR(&vEmailType) = SysAllocString(TO_OLE_STRING("NGW"));
// get Recipient
pIGWRecipients->Add(vTo,vEmailType,vTargetType,&pDIGWRecipient);
// get interface to recipient
if( !pDIGWRecipient ||
FAILED(pDIGWRecipient->QueryInterface(IID_IGWRecipient,(LPVOID
*)&pIGWRecipient)))
{
if(pDIGWRecipient) pDIGWRecipient->Release();
return FALSE;
}
pDIGWRecipient->Release();
status = pIGWRecipient->Resolve(vTargetType);
if(SUCCEEDED(status)) status = pIGWMessage->Send(&pDIGWRetMessage);
pIGWRecipient->Release();
pIGWRecipients->Release();
pBody->Release();
pSubject->Release();
//!!!
pIGWMessage->Release();
//!!!
pIGWMessages->Release();
pIGWWorkFolder->Release();
if(SUCCEEDED(status)) //return TRUE;
return AttachFlag;
else return FALSE;
};
Если вернуло SUCCESS то отсылаемый файл прибивается и делаем ФиндНекст итд.
Причем на GW 5.2 и 6.0 работало много лет.
Сравнивать цикл из GWSend.exe внутри cmd файла некорректно тк там каждый вызов GWSend стартует новый COInitalise(), логин и все такое а по выходу убиение всего проинициализированного - задержка на это немалая.
Думается мне что в новом групвайзе что-то изрядно подновлено во взаимодействии COM обьекта на клиенте и сервера GW (с сервером GW7 не важно какой будет клиент 60 65 или 7 картина одинаковая.
Если двигать гипотезы то может быть не успевают уничтожиться все созданные обьекты типа Message или там Attachment раз потом с ними мешанина происходит ?
Фиг его знает - на девелоперском форуме все молчат .
пересобрано с делеями все ок.
===============================================
Возник новый вопрос. Клиент GW7 не живет на Win9x.
Имеется в работе N, (N пока около трети всего парка ) штук оных станций с купленной вендой и пока они справляются выводить из строя их не будем. Там думаю будет жить клиент GW657.
Как бы замутить автоапдейт из SDD (Zen'а нетути ;( ) ?
Может сперва сделать апдейт на 65 всем а потом на 70 (там где венда 9x останется 65 .... ) ?