1

Konu: Sample kod from news2news

Herkese merhaba;

Geçmişte buna benzer bir soru hatırlıyorum. Arşivde arayıp post etmek yerine doğrudan yeni bir başlıkta yazmak daha kolayıma geldi.

Umarım birilerinin işine yarar :

http://news2news.com/vfp/index.php?example=491

Visual Fox Pro
LOCAL oForm

oForm = CREATEOBJECT("TForm")
oForm.Show(1)
* end of main
 
DEFINE CLASS TForm As Form
#DEFINE MAX_PATH 260
    Width=300
    Height=200
    BorderStyle=2
    MinButton=.F.
    MaxButton=.F.
    Autocenter=.T.
    Caption="Managing group of processes"
    hJob=0
 
    ADD OBJECT cmdOpenApp As CommandButton WITH;
    Left=90, Top=36, Width=120, Height=27, Caption="Open Document"
 
    ADD OBJECT cmdOpenDos As CommandButton WITH;
    Left=90, Top=70, Width=120, Height=27, Caption="Open DOS Window"
 
    ADD OBJECT cmdClose As CommandButton WITH;
    Left=90, Top=130, Width=120, Height=27, Caption="Close All"
 
PROCEDURE Init
    THIS.declare
 
PROCEDURE Destroy
    THIS.CloseJob
 
PROCEDURE cmdOpenApp.Click
    ThisForm.AddToJob
 
PROCEDURE cmdOpenDos.Click
    ThisForm.OpenDosWindow
 
PROCEDURE AddToJob
    LOCAL cPath, cDocName, hProcess, nResult
 
    cPath = SYS(5) + SYS(2003)
    cDocName = GETFILE("*;TXT;DOC;XLS;MDB;PDF;JPG;BMP;GIF")
    SET DEFAULT TO (m.cPath)
 
    IF NOT EMPTY(cDocName)
        hProcess = THIS.OpenDoc(cDocName)
 
        IF hProcess <> 0
            IF THIS.hJob = 0
                THIS.OpenJob
            ENDIF
 
            nResult = AssignProcessToJobObject(THIS.hJob, hProcess)
 
            IF nResult = 0
                ? "AssignProcessToJobObject faied:", GetLastError()
            ENDIF
 
        ENDIF
    ENDIF
 
PROCEDURE cmdClose.Click
    ThisForm.CloseJob
 
PROCEDURE OpenJob
    THIS.hJob = CreateJobObject(0, SUBSTR(SYS(2015), 3))
 
PROCEDURE CloseJob
    IF THIS.hJob <> 0
 
        LOCAL nResult
        nResult = TerminateJobObject(THIS.hJob, 0)
 
        IF nResult = 0
            ACTIVATE SCREEN
            ? "TerminateJobObject failed:", GetLastError()
        ENDIF
 
        = CloseHandle(THIS.hJob)
        THIS.hJob=0
    ENDIF
 
PROCEDURE OpenDosWindow
    LOCAL cSystem32, cAppName, hProcess
 
    cSystem32 = THIS.GetSystem32Directory()
    cAppName = cSystem32 + "\cmd.exe"
 
    IF NOT FILE(cAppName)
        cAppName = cSystem32 + "\command.com"
    ENDIF
 
    IF FILE(cAppName)
        hProcess = THIS.StartProcess(cAppName, "")
        IF hProcess <> 0
            IF THIS.hJob = 0
                THIS.OpenJob
            ENDIF
            = AssignProcessToJobObject(THIS.hJob, hProcess)
        ENDIF
    ENDIF
 
PROCEDURE GetSystem32Directory
    LOCAL cBuffer, nResult
    cBuffer = REPLICATE(CHR(0), MAX_PATH)
    nResult = GetSystemDirectory(@cBuffer, Len(cBuffer))
RETURN SUBSTR(cBuffer, 1, nResult)
 
PROCEDURE OpenDoc(cDocName)
    LOCAL cAppName
    cAppName = THIS.GetAppName(cDocName)
 
    IF LEN(cAppName)=0
        WAIT WINDOW NOWAIT "Default application not found for " +;
            CHR(13) + cDocName
        RETURN 0
    ENDIF
 
    WAIT WINDOW NOWAIT cAppName
RETURN THIS.StartProcess(m.cAppName, m.cDocName)
 
PROCEDURE StartProcess(cAppName, cCmdLine)
#DEFINE START_INFO_SIZE  68
 
#DEFINE CREATE_BREAKAWAY_FROM_JOB 0x01000000
#DEFINE NORMAL_PRIORITY_CLASS 0x00000020
 
    LOCAL cProcInfo, cStartInfo, nResult, hProcess, nFlags
 
    nFlags = BITOR(CREATE_BREAKAWAY_FROM_JOB, NORMAL_PRIORITY_CLASS)
 
    hProcess = 0
    cProcInfo = Repli(Chr(0), 16)
    cStartInfo = PADR(Chr(START_INFO_SIZE), START_INFO_SIZE, Chr(0))
 
    IF NOT EMPTY(m.cCmdLine)
        cCmdLine = [ "] + ALLTRIM(cCmdLine) + ["]
    ENDIF
 
    nResult = CreateProcess(cAppName, cCmdLine, 0,0,0,;
        nFlags,0, SYS(5)+SYS(2003),;
        @cStartInfo, @cProcInfo)
 
    IF nResult <> 0
    * retrieve process handle from PROCINFO structure
        hProcess = buf2dword(SUBSTR(cProcInfo, 1,4))
    ENDIF
RETURN m.hProcess
 
FUNCTION GetAppName(cFileName)
    LOCAL cResult
    cResult = REPLICATE(CHR(0), MAX_PATH)
    = FindExecutable(cFileName, "", @cResult)
RETURN ALLTRIM(STRTRAN(cResult, CHR(0), ""))
 
PROTECTED PROCEDURE declare
    DECLARE INTEGER GetLastError IN kernel32
 
    DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
 
    DECLARE INTEGER TerminateJobObject IN kernel32;
        INTEGER hJob, LONG uExitCode
 
    DECLARE INTEGER CreateJobObject IN kernel32;
        INTEGER lpJobAttributes, STRING lpName
 
    DECLARE INTEGER AssignProcessToJobObject IN kernel32;
        INTEGER hJob, INTEGER hProcess
 
    DECLARE INTEGER FindExecutable IN shell32;
        STRING lpFile, STRING lpDir, STRING @lpResult
 
    DECLARE INTEGER GetSystemDirectory IN kernel32;
        STRING @ lpBuffer, INTEGER nSize
 
    DECLARE INTEGER CreateProcess IN kernel32;
        STRING lpApplicationName, STRING lpCommandLine,;
        INTEGER lpProcessAttr, INTEGER lpThreadAttr,;
        INTEGER bInheritHandles, INTEGER dwCreationFlags,;
        INTEGER lpEnvironment, STRING lpCurrentDirectory,;
        STRING @lpStartupInfo, STRING @lpProcessInformation
 
ENDDEFINE
 
FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
    BitLShift(Asc(SUBSTR(lcBuffer, 2,1)),  8) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
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ü