1 Son düzenleyen, cetinbasoz (17.02.2017 15:30:55)

Konu: Activex Shellexecute (bitis eventi var)

Activex.dll kodunu buradan alabilirsiniz:

https://drive.google.com/file/d/0B1Q5wG … sp=sharing

Icerigini c:\cbUtilities dizinine cikardiginiz varsayarsak:

regasm c:\cbUtilites\cbUtilities.dll /codebase

ile register ediyorsunuz.

d:\temp dizininin varoldugunu kabul eden demo kodu:

Local o As "cbNetCOM.Utilities", eh As 'cbUtilityEvents'
o = Createobject("cbNetCOM.Utilities")

Local lcFileName
m.lcFileName = 'd:\temp\seTest.txt'
Strtofile('',m.lcFileName)

eh=Createobject("cbUtilityEvents",m.o)
Eventhandler(m.o, m.eh)

o.ShellExecProcess("notepad.exe", m.lcFileName, .F., .F.)

* Shellexecuted the process
* Lets do some work while it is running
* Just to demonstrate it is async and we get the event 
* when it exists

Public oTimer as Timer
oTimer = CreateObject('myTimer')
m.oTimer.Enabled = .t.



Define Class myTimer as Timer
  Interval = 5000 && every 5 seconds
  Procedure Timer
    ? 'I am doing nothing useful, just hanging around.', Datetime()
  endproc
enddefine

Define Class cbUtilityEvents As Session OlePublic
    Implements IcbEvents In "C:\cbUtilities\CBUTILITIES.TLB"

    oHook = Null

    Procedure Init(toHook)
        This.oHook = m.toHook
    Endproc

    Procedure IcbEvents_OnProcessExit(ExitCode As Number, exitTime As Date, exceptionMessage As String) As VOID
        If Empty(m.exceptionMessage)
            ? 'Process has exited on', m.exitTime, ' with exit code', m.ExitCode
            MessageBox(FileToStr('d:\temp\seTest.txt'))
        Else
            ? 'Process had and exception. Message:', m.exceptionMessage
        Endif
        Eventhandler(This.oHook,This,.T.)
        This.oHook = Null
    Endproc

Enddefine


Syntax:

ShellExecProcess(fileNameToShellExec, cArguments [, [lHidden] [, lWaitToExit]] )

fileNameToShellExec: Exe filename (or something like mydocument.doc to invoke with associated application).
cArguments: command line arguments if any else pass an empty string.
lHidden: Default TRUE. Doesn't show a window.
lWaitToExit: Default TRUE. What for exit or not.

2

Re: Activex Shellexecute (bitis eventi var)

Çetin bu kod bir exe 'nin işini bitirmesini bekleyip sonra foxpro da devam komutlarını yazmak için de kullanılır anladığım. Doğru mudur?

3

Re: Activex Shellexecute (bitis eventi var)

Üstat, ben shellexecute komutunu kimi zaman kullanıyorum. Genellikle invisible olarak. Senin DLL ile normal olarak kullandığımız Shellexecute arasında ne fark var?

Diyecektim... ki ;

Syntax taki Timer kısmını görünce, soruyu sormaktan vaz geçtim. smile

Yine KUPON bir iş çıkarmışsın Üstat. Eline sağlık..

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: Activex Shellexecute (bitis eventi var)

aydinufuk yazdı:

Çetin bu kod bir exe 'nin işini bitirmesini bekleyip sonra foxpro da devam komutlarını yazmak için de kullanılır anladığım. Doğru mudur?

Evet. Bu kod farkli sekillerde kullanilabilir. Normal ShellExecute ya da Run /n kullandigimizda, exe bagimsiz calisiyor ve ne zaman bittiginden haberimiz olmuyor. Ya da CreateProcess() ile waitForExit signal bekledigimizde, oturup onun isinin bitmesini beklememiz gerekiyor. Yani:

ShellExecute, Run /n - exeyi bagimsiz calistir. Bitisiyle ilgilenme.
Run, CreateProcess (waitForExitSignal) - exeyi calistir, modal form gibi bitmesini bekle.

Bu activex ile ise:
-exe'yi kendi penceresinde ya da gizli yapmak secimli.
-istersen bitmesini bekliyorsun, o zamana kadar islemler askida
-ya da bitmesini bekleme, normal islerine devam et. Bittiginde "event" ile haberin oluyor. (Form'da baska isler yaparken bir timer eventinin ya da mouse click eventinin calismasi gibi).

Ornegi aciklamak gerekirse:

-notepad.exe belli bir dosya ile calistiriliyor
-VFP normal islerini yapmaya devam ediyor (timer ile mesaj var, onun yerine normal bir formdaki islemler devam ediyor olabilirdi)
-Disardaki notepad kapandiginda, event ile haber veriyor. O zaman dosyanin degismis halini acip okuyoruz.

Aklima notepad geldigi icin onunla ornekledim. Onun yerine, ornegin birkac siteden veri indirip bir yerlere koyan bir exe olabilirdi, isi bitince, VFP indirilenleri isleyecektir mesela. Bu activex'in yazilmasina onayak olan universalthread'deki bir soruydu:

"ShellExecute ile calistirdigimiz exe'nin bitmesini beklemek VFP ile mumkun mu?" diye. Ben de, her seferinde beklemek yerine, madem olanak var, ya bekleyelim, ya da bittiginde event ile haberimiz olsun diye yazdim smile

5

Re: Activex Shellexecute (bitis eventi var)

ÇETİN Aklına sağlık...
Benim işime yaracak. Başka bir programı yaklaşık ne sürede işini bitirir diye ortalama ekleme süresi koyup sonra işleme devam ediyordum.. Şimdi bittiği  görüp işime devam ettirebilirim.  İlk fırsata deneyip sonucu bildirirm..

6

Re: Activex Shellexecute (bitis eventi var)

activex'te bir sorun var:( Sorunu bulmakla pek ugrasmaya vaktim yok.