|
[ Ivan_Grunf @ 07.02.2006. 10:21 ] @
| Imam sledeci problem: program mi radi kada prolazim kroz kod rucno (zaustavim ga u kodu i idem liniju po liniju) , dok, kada ga pustim da odradi sve normalno on se zablokira. Takodje, kada ubacim neku poruku (msgbox) unutar koda (sto znaci da on saceka malo sa izvrsavanjem) opet sve radi ok. Evo koda koji pravi problem:
Code:
Dim objOutlook As New Outlook.Application
Dim objMail As Outlook.MailItem
Dim objRecipient As Outlook.Recipient
Set objMail = objOutlook.CreateItem(olMailItem)
With objMail
Set objRecipient = .Recipients.Add(strAddress)
objRecipient.Type = olTo
.Subject = "dokument"
.Attachments.Add (App.Path & "\doc\fajl.doc")
.Send
End With
Set objRecipient = Nothing
Set objMail = Nothing
Set objOutlook = Nothing
SendMail = True
Clear:
Exit Function
MsgError:
MsgBox Err.Description
SendMail = False
GoTo Clear
Otprilike mi se cini da problem nastaje u ovom poslednjem delu kada se objekti unistavaju i oslobadjaju memoriju posto sam primetio kada ja prolazim kod, treba im malo vremena da to urade. Pretpostavljam da je problem u brzini unistavanja objekata i njihovoj povezanosti, ali ne znam kako da to resim! |
[ Ivan_Grunf @ 07.02.2006. 15:33 ] @
A da, evo jos jedne zanimljivosti u vezi ovoga:
Kada mi je ukljucen Outlook, program radi, a kada nije onda program pravi ovaj problem, tj. blokira se. Takodje, radise o Outlook-u, a ne o Outlook Express-u, da ne bude zabune.
Nadam se da neko ZNA resenje...
[ batalule @ 07.02.2006. 22:09 ] @
Pa program ti radi u debug modu zato sto Outlook ima vremena da posalje mail a u runtime-u on krene da salje mail a ti mu ubijes referencu sa Nothing.
Mogao bi da koristis ItemSend event pa u njemu da uradis garbage collection.
Znaci napises negde
[Private][Public] WithEvents objOutlook As Outlook.Application
Onda postavi varijablu u nekoj rutini sa
Set objOutlook = New Outlook.Application
napravi mail, posalji ga sa Send metodom a negde u modulu ili formi napisi event handler:
Private Sub objOutlook_ItemSend(ByVal Item As Object, Cancel As Boolean)
' ovde proveri da li je poslato ono sto si hteo da posaljes pa ako jeste onda zavrsi
' sa aplikacijom
objOutlook.Quit
' Pa tek kada uradis quit onda ubij reference inace ako ovo ne uradis moze da ti se
' desi da imas jedno xyz Outlook aplikacija koje mozes da vidis u Task Manageru
End Sub
Mada, mislim da sve ovo ima da ti radi kako si vec napisao ako samo izostavis onaj deo sa Nothing ali kao sto rekoh Outlook ti ostaje u memoriji samo sto ga ne vidis na task baru. Uz put jedna napomena: kada radis sa office aplikacijama ili bilo kojim drugim na koje se referenciras imas magicni F2 [Object Browser] pa u njemu prvo pogledas dogadjaje, svojstva i metode pa jos ako je aplikacija valjano dokumentovana desni klik pa Help i skapiras kako app sljaka u pozadini
Evo ti objasnjenje za pomenuti event:
ItemSend occurs whenever an item is sent, either by the user through an Inspector (before the inspector is closed, but after the user clicks the Click button) or when the Send method is used in a program. This event is not available in VBScript.
[ Ivan_Grunf @ 08.02.2006. 12:19 ] @
Citat: batalule: Private Sub objOutlook_ItemSend(ByVal Item As Object, Cancel As Boolean)
' ovde proveri da li je poslato ono sto si hteo da posaljes pa ako jeste onda zavrsi
' sa aplikacijom
Kako ovo da proverim? Probao sam da ubacim property Sent, ali ono je ili False, ili mi kaze <Item have been moved or deleted.> tako da ne mogu da utvrdim njegovu vrednost, a treba da vrati boolean.
U stvari, ja sam pokusao da posle slanja sa naredbom objOutlook.Send napravim petlju koja ispituje da li je objOutlook.Sent = true ili False, koja bi se vrtela sve dok nije true, ali posle funkcije Send, vrednost property-ja Sent je <Item have been moved or deleted.> i to onda ode na errorhandler sa tom porukom. Kako da realizujem moju ideju?
Citat:
objOutlook.Quit
' Pa tek kada uradis quit onda ubij reference inace ako ovo ne uradis moze da ti se
' desi da imas jedno xyz Outlook aplikacija koje mozes da vidis u Task Manageru
End Sub
Ovo sam i ja ocekivao, ali nekako se on u Task Manageru izbrise, iako ne uradim objOutlook.Quit, vec samo Set objOutlook = Nothing. To sa Word-om, recimo, ne prolazi. Njega bas moras da zatvoris, pa onda tek "set nothing"
[ Ivan_Grunf @ 09.02.2006. 10:27 ] @
Ok, probao sam da implementiram ovaj metod Private Sub objOutlook_ItemSend u istom modulu gde mi je ta funkcija za slanje mailova. Evo kako sam napisao kod koji odgovara onim nazivima objekata iz poruke na pocetku (dodacu ponovo i taj kod):
Code:
Private Sub objOutlook_ItemSend(ByVal objMail As Object, Cancel As Boolean)
Prompt$ "Da posaljem mail? " & objMail.Subject & "?"
If MsgBox(Prompt$, vbYesNo + vbQuestion, "Sample") = vbNo Then
Cancel = True
End If
End Sub
Kada posaljem mail, ova procedura se ne okida. Zasto?
Evo ga i kod od f-je koja salje mailove, a koja je u istom modulu gde i procedura _ItemSend:
Code:
Dim objOutlook As New Outlook.Application
Dim objMail As Outlook.MailItem
Dim objRecipient As Outlook.Recipient
Set objMail = objOutlook.CreateItem(olMailItem)
With objMail
Set objRecipient = .Recipients.Add(strAddress)
objRecipient.Type = olTo
.Subject = "dokument"
.Attachments.Add (App.Path & "\doc\fajl.doc")
.Send
End With
Set objRecipient = Nothing
Set objMail = Nothing
Set objOutlook = Nothing
SendMail = True
Clear:
Exit Function
MsgError:
MsgBox Err.Description
SendMail = False
GoTo Clear
Mozda bi za ovo trebao vec da otvorim drugu temu, neka odluci moderator...
[ batalule @ 10.02.2006. 16:23 ] @
Citat:
Kada posaljem mail, ova procedura se ne okida. Zasto?
Evo ga i kod od f-je koja salje mailove, a koja je u istom modulu gde i procedura _ItemSend:
Na tvoje "Zasto" i ja imam "zasto". Moje "zasto" glasi: zasto nisi lepo procitao sta sam ti napisao? Tamo ti je sve objasnjeno vec ali ponavljam:
ne mozes da napises
Code:
Dim objOutlook As New Outlook.Application 'to ti je early binding pogledaj malo MSDN ako ne znas sta je rano vezivanje i obavezno procitaj "Handling an Object's Events"
nego moras da koristis event pa onda moras da napises kao sto sam ti vec rekao
Code:
Dim objOutlook as Outlook.Application' ovo napises u "Declarations section" forme
pa onda negde u nekoj rutini/funkciji kako ti je volja vec uradi
Code:
Set objOutlook = New Outlook.Application
Tek ovako ce da ti se okine
Code:
Private Sub objOutlook_ItemSend(ByVal objMail As Object, Cancel As Boolean)
iz ovoga sto si napisao u poslednjoj poruci vidi se da nisi tako uradio.
[Ovu poruku je menjao batalule dana 10.02.2006. u 17:27 GMT+1]
[ Ivan_Grunf @ 13.02.2006. 10:49 ] @
Ok batalule, kao sto vidis nov sam ovde tako da se nisam snasao odmah sa tvojim predlozima. Nadam se da to nije problem. Evo uspeo sam da od tvog prvog i ovog drugog predloga napravim neki kod koji okida event _ItemSend, ali i dalje imam problem. Naime, kada unutar te metode pokusam da ispitam (sa property-jem Sent) da li je mail poslat, on sve vreme pokazuje da je False. Evo koda koji se poziva (sada sam sve premestio u klasu):
Code:
Public WithEvents objOutlook As Outlook.Application
Private Sub Class_Initialize()
Set objOutlook = New Outlook.Application
End Sub
Public Function SMail(ByVal strFile As String, _
strStatus As String, _
Optional ByVal strComputerName As String, _
Optional ByVal strOpId As String, _
Optional strAddress As String = " [email protected]") As Boolean
On Error GoTo MsgError
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim objMail As Outlook.MailItem
Dim objRecipient As Outlook.Recipient
Set objMail = objOutlook.CreateItem(olMailItem)
Set objRecipient = objMail.Recipients.Add(strAddress)
objRecipient.Type = olTo
objMail.Subject = "Proba"
objMail.Attachments.Add (App.Path & "\doc\" & strFile)
objMail.Send
fso.DeleteFile App.Path & "\doc\" & strFile
SMail = True
Clear:
Set fso = Nothing
Set objRecipient = Nothing
Set objMail = Nothing
Exit Function
MsgError:
MsgBox Err.Description
SMail = False
GoTo Clear
End Function
Private Sub objOutlook_ItemSend(ByVal objMail As Object, Cancel As Boolean)
While Not objMail.Sent
Wend
Set objMail = Nothing
Set objRecipient = Nothing
End Sub
Private Sub Class_Terminate()
Set objOutlook = Nothing
End Sub
Gde gresim? Meni se cini da je problem i u nekom podesavanju Outlook-a. Meni stoji oznacena opcija 'Send messages immediatly when connected' u Outlook-u. Kada to ne stoji oznaceno, program radi ok, a pisma ostanu u Outbox-u.
[ Ivan_Grunf @ 13.02.2006. 10:52 ] @
Imam jos jedno interesantno zapazanje: Ako je zaista problem u tome sto ja pokusavam da ubijem mail dok on pokusava da ga posalje, zasto bi postojala razlika u odnosu na to da li je Outlook ukljucen ili ne.
Znaci, kada je Outlook ukljucen, sve prodje ok, a kada je iskljucen onda pravi problem.
[ Ivan_Grunf @ 13.02.2006. 11:47 ] @
Inace, ja koliko znam (a pogledao sam i u knjizi za VB koju imam "Vodic kroz VB6", QUE) rano povezivanje je sve ono gde ti unapred zadas tip objekta, nezavisno od toga da li mu i odvojis memoriju sa New, ili ne. Tako da ona tvoja deklaracija Dim objOutlook as Outlook.Application nije kasno povezivanje vec isto tako rano povezivanje. Kada bi definisao:
Dim objOutlook as Object
pa kasnije uradio
Set objOutlook = New Outlook.Application ili
Set objOutlook = CreateObject("Outlook.Application")
to bi bilo kasno povezivanje (vidi neku literaturu)
Citat: batalule: Na tvoje "Zasto" i ja imam "zasto". Moje "zasto" glasi: zasto nisi lepo procitao sta sam ti napisao? Tamo ti je sve objasnjeno vec ali ponavljam:
ne mozes da napises
Code:
Dim objOutlook As New Outlook.Application 'to ti je early binding pogledaj malo MSDN ako ne znas sta je rano vezivanje i obavezno procitaj "Handling an Object's Events"
nego moras da koristis event pa onda moras da napises kao sto sam ti vec rekao
Code:
Dim objOutlook as Outlook.Application' ovo napises u "Declarations section" forme
[ Shadowed @ 13.02.2006. 12:18 ] @
Kada je Outlook aktivan manje mu je vremena potrebno da posalje mail.
[ Ivan_Grunf @ 13.02.2006. 14:36 ] @
OK,evo po 1001. put sam propratio sve (iza svake linije koda upisivao sam neki komentar u log fajl), izbacio sam kod koji unistava bilo koji objekat koji je vezan za Outlook, i opet je program ublokirao, i to onda kada je pokusao da izadje iz f-je u kojoj saljem mail. Cak vrlo cesto mi se desi da mail stigne na adresu, a program stoji ublokiran.
Pretpostavljam da on i pri izlasku iz f-je pokusava da ubije Outlook,ali ne moze. Prvo sam mislio da je problem u objektu MailItem, ali izgleda da nije. Nije mi jasno zasto ne mogu da unistim Outlook objekat???
[ batalule @ 13.02.2006. 20:42 ] @
Pa upisi lepo u petlju
Code:
While Not objMail.Sent
DoEvents ' ovo upisi
Wend
jer ti ovako toliko nagaris Outlook i VB da oni zajedno pojedu 100% procesorkog vremena. Ja probao kod mene i radi i sa podignutim Outlook-om i bez njega.
[ Ivan_Grunf @ 14.02.2006. 07:36 ] @
Citat: batalule: Pa upisi lepo u petlju
Code:
While Not objMail.Sent
DoEvents ' ovo upisi
Wend
jer ti ovako toliko nagaris Outlook i VB da oni zajedno pojedu 100% procesorkog vremena. Ja probao kod mene i radi i sa podignutim Outlook-om i bez njega.
Ne, nije pomoglo. Jedino sto je drugacije jeste da mi se forma sada ne "slogira" vec mogu da je pomeram a ranije nisam mogao.
A inace kada se ublokira, procesor je na 0% , a procesorsko vreme objekta Outlook je oko 1-2 sec. Cesto on i posalje mail (pre ove izmene) tako da kada ga ubijem u task manageru, program nastavi da radi...
[ batalule @ 14.02.2006. 12:59 ] @
Evo pogledao sam kako to radi "ispod haube" i evo u cemu je stvar: naveo sam te na pogresan put u principu ali sam to tek sada uvideo... sorry
Event "ItemSend(ByVal objMail As Object, Cancel As Boolean)" ima jedan problem a to je da se njemu prosledjuje objMail po vrednosti a ne po referenci (to sam prevideo) a kada se on desi mail se tek premesta u Outbox - drugim recima ne mozes da ga pitas za Sent property jer je on uvek u ovom eventu False. Ali mozes nesto drugo sada mi pada napamet a to je da pogledas u Outbox ili u Sent Items folderu (izeksperimentisi malo) pa tamo vidi jel ima maila koji si poslao (Outlook prvo napravi mail, onda ga premesti u Outbox iz outbox-a ga salje odmah ako ti je "Send imedietely" opcija ukljucena a na "SendReceive" ako nije ukljucena, i TEK kada ga posalje premesti ga u Sent Items znaci ovo je gde bi posle nekog vremena trebao da bude). Znaci, iskometarisi sav kod u eventu i ono ce da radi - mora da radi - a ostatak posla prepusti Outlook-u nek on vodi racuna o mailu i neka ga salje shodno njegovim podesavanjima. Ono sto tebe treba da interesuje je ne da li je mail poslat (to ce Outlook da uradi sam ako ga podesis kako treba) nego da li je mail stigao na odrediste pa mozes da dodas header u mail "request a read receipt for this message". Izvini jos jedanput na pogresnom navodjenju i javi jel si uspeo.
[ Ivan_Grunf @ 14.02.2006. 13:50 ] @
Pa vidis, tu je mali problem. Outlook mi je podesen na 'Send messages immediatly when connected' i da proverava na svakih 1 min. I kada je ukljucen, moj prog radi ok. ALI, ako iskljucim OL, onda se desava da neki put prodje , a neki put ne. Najcesce, prodje mail (sto znaci da je dosao do sent foldera), a prog mi se ublokira. Probao sam na jos jednoj slicnoj makini (samo manje ram-a), ista prica, samo dosta cesce bude sve ok, ali se desi i da se ukoci. To je meni nedopustivo jer pravim prog koji treba da radi non-stop mesecima i ne sme da se desi da se ublokira ni jednom. Takodje, kada mi nije ukljucena opcija da proverava na svakih x min, mail mi ostane u Outbox-u. I tada sve se zavrsi ok. Ali ne posalje mi mail.
Sto se tice gledanja u Sent items, nema svrhe, jer mail stigne tamo a Outlook ostane u memoriji (sto mi ublokira program - verovatno jer ne moze da rastereti memoriju). Ja sam cak pokusao i da ga ostavim u memoriji ali opet isto - verovatno izlazak iz f-je takodje pokusa da ukine reference na memoriju pa mu to dodje na isto.
Znaci ja sam hteo da ispitujem da li je mail poslat da bi znao kada da ubijem Outlook, ali ocigledno nije u tome problem. Ili mozda jeste? A kada program posalje mail, a Outlook ostane ukljucen, ublokiravsi moj program, ja ne mogu vise na taj nacin da resim problem. Znaci, sada me zanima da li neko moze da mi pomogne da otkrijem zasto Outlook nece da mi se ukine iz memorije? Da li mozda u task manageru -> View -> Select Coloumns mogu to da vidim? Verovatno je sa nekim drugim objektom 'mrtvo zakljucan'. Ali ne znam kako to da provalim!
[ Ivan_Grunf @ 14.02.2006. 13:53 ] @
Ili mozda neko ima neku finu f-ju/klasu u VB-u, koja salje mail-ove sa attachmentima bez outlook-a...
[ Nibble @ 14.02.2006. 14:25 ] @
Jel to pravis nekog mass mailera ;).Evo ti kod za slanje meilova bez winsock ocx kontrole(Just API) naravno uz mogucnost slanja attachmenta.
[ batalule @ 14.02.2006. 18:35 ] @
Imas na PlanetSource-u jedno desetak mailera pa odaberi ... :-)
[ Ivan_Grunf @ 16.02.2006. 10:46 ] @
Ma joook, ne planiram da napravim nikakav mass mailer, naprotiv, program treba u jednoj firmi da pakuje s vremena na vreme neki fajl i da ga salje.
Ok, a koja je adresa planetsource-a? Pretpostavljam da sam jedini koji ne zna :)
[ Ivan_Grunf @ 16.02.2006. 14:43 ] @
Citat: Nibble: Jel to pravis nekog mass mailera ;).Evo ti kod za slanje meilova bez winsock ocx kontrole(Just API) naravno uz mogucnost slanja attachmenta.
Ja nisam uspeo da nadjem mogucnosti attachmenta :( Mislim da gresis.
A inace koja je razlika u slanju ako ide preko winsocket-a, CDO, MAPI objekata i sta god jos ima? Sta je najcistije, sta se na sta oslanja itd. Bas me to zanima.
[ batalule @ 16.02.2006. 18:49 ] @
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|