## Coverage profiler SDK

### API Funkce

- SetLastError()
- GetLastError()
- CreateProcess()
- WaitForSingleObject()
- CloseHandle()
- MoveFile()
- Sleep()
- GetExitCodeProcess()

#### SetLastError()

Nastaví poslední chybu pro volající vlákno.
    NONE SetLastError(
       fdwError INTEGER && Číslo chyby
    )
  Parametr: fdwError Číslo chyby. Příklad:
      =LoadDllFunc("DECLARE INTEGER SetLastError IN KERNEL32.DLL INTEGER fdwError")
      =SetLastError(0) && Nastav, že nedošlo k žádné chybě

#### GetLastError()

Pokusí se inicializovat API funkce v DLL knihovnách.
    INTEGER GetLastError()
  Vrací: Číslo poslední chyby. Příklad:
      =LoadDllFunc("DECLARE INTEGER SetLastError IN KERNEL32.DLL INTEGER fdwError")
      =LoadDllFunc("DECLARE INTEGER GetLastError IN KERNEL32.DLL")
      =LoadDllFunc("DECLARE INTEGER MoveFile IN KERNEL32 STRING @, STRING @")
      =SetLastError(0) && Nastav, že nedošlo k žádné chybě
      * Pokus se přejmenovat soubor
      IF MoveFile(("c:\temp\file1.txt"+CHR(0)),("c:\temp\file2.txt"+CHR(0)))=0
         * Nepodařilo se to
         ?GetLastError()
      ENDIF

#### CreateProcess()

Tato funkce umožňuje spouštět EXE/COM/PIF/SCR moduly i s parametry a ovlivněním hlavního okna aplikace.
    INTEGER CreateProcess(
       lpApplicationName STRING,    && Název spouštěného modulu
       lpCommandLine STRING,        && Příkazový řádek
       lpProcessAttributes INTEGER, && Bezpečnostní atributy procesu
       lpThreadAttributes INTEGER,  && Bezpečnostní atributy threadu
       bInheritHandles INTEGER,     && Handle inheritance flag
       dwCreationFlags INTEGER,     && Příznak vytvoření procesu
       lpEnvironment INTEGER,       && Ukazatel na nový blok prostředí
       @lpCurrentDirectory STRING,  && Ukazatel na název startovacího adresáře
       @lpStartupInfo STRING,       && Ukazatel na STARTUPINFO
       @lpProcessInformation STRING && Ukazatel na PROCESS_INFORMATION
    )
  Parametr: lpApplicationName Název spouštěného modulu. Může být prázdný, ale pak musí být vyplněn parametr lpCommandLine. lpCommandLine Příkazový řádek. Může být prázdný, ale pak musí být vyplněn parametr lpApplicationName. lpProcessAttributes Bezpečnostní atributy procesu. Pouze pro Windows NT a vyšší, může být .NULL. . lpThreadAttributes Bezpečnostní atributy threadu. Pouze pro Windows NT a vyšší, může být .NULL. . bInheritHandles Handle inheritance flag. Příznak,zda nový proces zdědí handly z volaného procesu. Jestliže ANO , pak každý zděděný otevřený handle ve volaném procesu je předán novému procesu. Předané handly mají stejná přístupová práva,jako původní,zděděné. dwCreationFlags Příznak vytvoření procesu. Kumulativní příznak pro vytvoření procesu. Je to součet některých z níže uvedených konstant: CREATE_DEFAULT_ERROR_MODE, CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, CREATE_SEPARATE_WOW_VDM, CREATE_SHARED_WOW_VDM, CREATE_SUSPENDED, CREATE_UNICODE_ENVIRONMENT, DEBUG_PROCESS, DEBUG_ONLY_THIS_PROCESS, DETACHED_PROCESS a NORMAL_PRIORITY_CLASS nebo IDLE_PRIORITY_CLASS nebo HIGH_PRIORITY_CLASS nebo REALTIME_PRIORITY_CLASS Nás zajímá pouze konstanta NORMAL_PRIORITY_CLASS, která určuje prioritu nově spuštěného procesu. lpEnvironment Ukazatel na blok prostředí. Pokud parametr není zadán, pak nový proces použije blok prostředí volajícího procesu. lpCurrentDirectory Ukazatel na řetězec , který specifikuje počáteční (startovací) adresář. Tento adresář musí obsahovat disk. Pokud parametr není předán, pak nový proces použije startovací adresář volajícího procesu. lpStartupInfo Ukazatel na strukturu STARTUPINFO popisující jaká má být velikost, pozice atd. hlavního okna procesu. lpProcessInformation Ukazatel na strukturu PROCESS_INFORMATION, která po spuštění nového procesu obsahuje jeho identifikaci. Vrací: Pokud se funkce ukončí korektně, pak vrací číslo > 0. Pokud se funkce neukončí korektně, pak vrací 0. Upřesňující kód chyby lze zjistit pomocí API funkce GetLastError(). Příklad:
      LOCAL loSI,loPI,lcSI,lcPI,lcProgram,liExitCode
      * Deklarace API funkcí
      =LoadDllFunc("DECLARE INTEGER CreateProcess IN kernel32.DLL STRING, STRING, INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, STRING @, STRING @, STRING @")
      =LoadDllFunc("DECLARE INTEGER SetLastError IN kernel32 Integer fdwError")
      =LoadDllFunc("DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject")
      =LoadDllFunc("DECLARE INTEGER WaitForSingleObject IN kernel32.DLL INTEGER hHandle, INTEGER dwMilliseconds")
      *=LoadDllFunc("DECLARE         Sleep IN kernel32 integer")
      *=LoadDllFunc("DECLARE INTEGER GetExitCodeProcess   IN kernel32 INTEGER ,INTEGER @")

      * Vytvoř objekt pro ovlivnění hlavního okna aplikace
      loSI=CREATEOBJECT("_struc_STARTUPINFO")
      * Vytvoř objekt pro navrácení informací o spuštěném procesu
      loPI=CREATEOBJECT("_struc_PROCESS_INFORMATION")

      * Při spuštění procesu skryj hlavní okno aplikace
      loSI.dwFlags=STARTF_USESHOWWINDOW
      loSI.wShowWindow=SW_HIDE

      * Vytvoř C++ strukturu z VFP objektu
      lcSI=loSI.CreateString()
      lcPI=loPI.CreateString()

      lcProgram = "Muj.exe param1 param2" + CHR(0)
      =SetLastError(0)
      IF CreateProcess(.NULL., lcProgram, 0, 0, 1,  NORMAL_PRIORITY_CLASS, 0, (GetTempPathEx()+CHR(0)), @lcSI, @lcPI)<>0
         * Výborně neselhalo to
         * Načti zpět informace o spuštěném procesu z řetězce do vlastností tříd.
         loPI.ReadString(@lcPI)
         * Čekej, dokud proces běží
         DO WHILE WaitForSingleObject(loPI.hProcess, 250 ) = WAIT_TIMEOUT

         ENDDO

         * Čekej, dokud proces běží (použití funkce GetExitCodeProcess())
         liExitCode=STILL_ACTIVE
         DO WHILE liExitCode=STILL_ACTIVE
            =Sleep(500)
            =GetExitCodeProcess(loPI.hProcess,@liExitCode )
         ENDDO

         =CloseHandle(loPI.hProcess) && Uzavři handle
      ENDIF

#### WaitForSingleObject()

Tato funkce vrací jestli objekt signalizuje stav nebo zda vypršel časový interval.
    INTEGER WaitForSingleObject(
       hHandle INTEGER,        && Handle objektu
       dwMilliseconds INTEGER  && Čas v milisekundách
    )
  Parametr: hHandle Handle objektu dwMilliseconds Čas v milisekundách Vrací:
  WAIT_ABANDONED | Objekt byl přerušen
  WAIT_OBJECT_0 | Objekt signalizuje
  WAIT_TIMEOUT | Pokud dojde k uplynutí intervalu a objekt nesignalizuje
Příklad:

#### CloseHandle()

Uzavře handle otevřeného objektu.
    BOOLEAN CloseHandle(
       liHandle INTEGER && Handle objektu
    )
Parametr: liHandle Handle objektu Vrací: .T. pokud se podaří handle uzavřít .F. pokud se to nepodaří. Příklad:

#### MoveFile()

Přejmenuje/přesune soubor.
    INTEGER MoveFile(
       @lcFileOld STRING, && Umístění a název souboru
       @lcFileNew STRING  && Nové umístění a název souboru
    )
  Parametry: lcFileOld Umístění a název souboru lcFileNew Nové umístění a název souboru Vrací: 0 - Při přesunu došlo k chybě >=1 - Přesun proběhl bez chyb Poznámka: Oba parametry musí být ukončeny znakem /0. Příklad:
      =LoadDllFunc("DECLARE INTEGER MoveFile IN KERNEL32 STRING @, STRING @")
      IF MoveFile(("C:\temp\file.txt"+CHR(0)),("C:\temp\file2.txt"+CHR(0)))=0
         WAIT WIND "Chyba"
      ENDIF

#### Sleep()

Pozastaví akutální vlákno na určitou dobu.
    NONE Sleep(
       liInterval INTEGER && Interval
    )
Parametr: liInterval Interval v milisekundách po který má vlákno stát. Příklad:

#### GetExitCodeProcess()

Vrátí návratový kód ukončeného procesu.
    INTEGER GetExitCodeProcess(
       liProcess INTEGER, && Handle procesu
       @liStatus INTEGER  && Status procesu
    )
Parametry: liProcess Handle procesu liStatus Status procesu Vrací: 0 - Při volání funkce došlo k chybě >=1 - Volání funkce proběhle bez chyb Parametr liStatus je naplněn aktuálním statusem procesu. Příklad: