11. Другие возможности

Назад Содержание Дальше

11.1 Работа с файловой системой

11.1.1 Работа с файлами

Зачастую при написании скриптов возникает необходимость считывать данные из внешних файлов или, наоборот, записывать туда какие-либо данные. В SilkTest-е существуют несколько функций, позволяющих работать с файлами:

 

  1. FileOpen (sPath, fmMode [, fsShare[, ftType]]) – открывает файл. Возвращает указатель (handle) на открытый файл, для дальнейшей работы с ним. Параметры: sFile – имя файла, fmMode – режим, в котором должен быть открыт файл (чтение/запись), fsShare – определяет, будет ли доступен файл другим пользователям/приложениям и как именно он будет доступен (чтение, запись и т.д.), ftType – формат текстового файла при открытии (доступен только в SilkTest International). Например:

     

    Code

    	[ ] HFILE hFile = FileOpen ("c:\file.txt", FM_WRITE)
    

    Открыть файл “c:\file.txt” для записи. При этом содержимое файла, если он уже существует, стирается. hFile в данном случае – переменная, с которой мы будем работать дальше, записывая данные в файл. Режим FM_WRITE задает тип открытия файла (в данном случае для записи). Существуют следующие типы режимов открытия файлов:

    • FM_READ – только чтение
    • FM_WRITE – только для записи
    • FM_UPDATE – для добавления данных в начало файла
    • FM_APPEND – для добавления данных в конец файла
  2. FileClose (hFile) – закрывает ранее открытый файл hFile. Например, после выполнения следующего кода на диске будет создан пустой файл “c:\file.txt”:

     

    Code

    	[ ] HFILE hFile = FileOpen ("c:\file.txt", FM_WRITE)
    	[ ] FileClose (hFile)
    

     

  3. FileReadLine (hFile, sLine), FileWriteLine (hFile, sLine) – соответственно считывает и записывает очередную строку из/в файл. Функция FileReadLine возвращает TRUE до тех пор, пока не будет достигнут конец файла. В следующем примере файл заполняется случайными строками, после чего содержимое файла считывается в список строк lsContents:

     

    Code

    	[ ] HFILE hF = FileOpen ("c:\file.txt", FM_WRITE)
    	[ ] INTEGER i
    	[-] for i = 1 to 10
    		[ ] FileWriteLine (hF, RandStr ("X(10)"))
    	[ ] FileClose (hF)
    	[ ] 
    	[ ] LIST OF STRING lsContents
    	[ ] STRING sLine
    	[ ] hF = FileOpen ("c:\file.txt", FM_READ)
    	[-] while (FileReadLine (hF, sLine))
    		[ ] ListAppend (lsContents, sLine)
    	[ ] FileClose (hF)
    	[ ] ListPrint (lsContents)
    

    Обратите внимание, что данный фрагмент кода показан лишь в качестве примера. Для считывания содержимого файла в список строк удобнее воспользоваться одной из функций SYS_GetFileContents, ListRead или SYS_ListRead.

  4. FileReadValue (hFile, aValue), FileWriteValue (hFile, aValue) – соответственно считывает и записывает в файл данные любого типа. Ниже показан пример записи и считывания разных типов данных.

     

    Code

    [ ] // Объявление этого типа должно находиться Вне тесткейсов и функции Main!!!
    [-] type MyType is record
    	[ ] STRING sStringField
    	[ ] BOOLEAN bBooleanField
    	[ ] INTEGER iIntField
    
    	[ ] INTEGER  i1 = 54, i2
    	[ ] REAL   r1 = 13.8, r2
    	[ ] STRING   s1 = "some string", s2
    	[-] MyType   m1, m2
    		[ ] m1.sStringField = "Some text"
    		[ ] m1.bBooleanField = TRUE
    		[ ] m1.iIntField = 132
    	[ ] 
    	[ ] HFILE hF = SYS_FileOpen ("c:\file.txt", FM_WRITE)
    	[ ] FileWriteValue (hF, i1)
    	[ ] FileWriteValue (hF, r1)
    	[ ] FileWriteValue (hF, s1)
    	[ ] FileWriteValue (hF, m1)
    	[ ] FileClose (hF)
    	[ ] 
    	[ ] hF = FileOpen ("c:\file.txt", FM_READ)
    	[ ] FileReadValue (hF, i2)
    	[ ] FileReadValue (hF, r2)
    	[ ] FileReadValue (hF, s2)
    	[ ] FileReadValue (hF, m2)
    	[ ] FileClose (hF)
    	[ ] 
    	[ ] Print (i2, r2, s2, m2)
    

    Выводимый в конце результат будет таким:

    Code

    54 13.800000 some string {Some text, TRUE, 132}
    

     

  5. FileSetPointer (hFile, iNewValue [, SetMode] ) – устанавливает позицию чтения/записи в символах. hFile – переменная типа HFILE, указывающая, для какого файла устанавливается позиция; iNewValue – количество символов, на которое сдвигается позиция в файле. Значение этого параметра задается в зависимости от того, какое значение передается в третьем параметре: SetMode. SetMode может принимать три значения:
    • FP_START (значение по умолчанию) – при таком значении параметра SetMode позиция iNewValue будет установлена на iNewValue символов вперед относительно начала файла. Значение iNewValue должно быть положительным;
    • FP_END – позиция чтения/записи сдвигается на iNewValue символов назад, начиная от конца файла. Значение iNewValue должно быть отрицательным;/
    • FP_RELATIVE – позиция чтения/записи сдвигается относительно текущей позиции, может принимать как положительные, так и отрицательные значения.

    Ниже приведен пример использования функции FileSetPointer:

     

    Code

    	[ ] STRING s = "abcdefghijklmno"
    	[ ] 
    	[ ] HFILE hF = FileOpen ("c:\file.txt", FM_WRITE)
    	[ ] FileWriteValue (hF, s)
    	[ ] FileClose (hF)
    	[ ] 
    	[ ] hF = FileOpen ("c:\file.txt", FM_READ)
    	[ ] FileSetPointer (hF, 5, FP_START)
    	[ ] FileReadLine (hF, s)
    	[ ] Print (s)
    	[ ] 
    	[ ] FileSetPointer (hF, -10, FP_END)
    	[ ] FileReadLine (hF, s)
    	[ ] Print (s)
    	[ ] 
    	[ ] FileSetPointer (hF, -7, FP_RELATIVE)
    	[ ] FileReadLine (hF, s)
    	[ ] Print (s)
    	[ ] 
    	[ ] FileClose (hF)
    

    Результат работы:

    Code

    	[ ] efghijklmno"
    	[ ] ijklmno"
    	[ ] lmno"
    

     

 

Кроме вышеперечисленных в SilkTest-e также есть функции SYS_FileOpen, SYS_FileClose, SYS_FileReadLine, SYS_FileWriteLine, SYS_FileReadValue, SYS_FileWriteValue и SYS_FileSetPointer. Их отличие от описанных функций в том, что исполняются они не процессом SilkTest-a, а процессом Агента. Это значит, что если во время тестирования необходимо подключаться к Агенту на удаленной машине и создавать файл на той самой машине, на которой установлен этот Агент, то необходдимо использовать функции SYS_…

Например, в следующем примере мы создадим файл file.txt в корневом каталоге диска С: на машине с именем MY_SERVER:

Code

	[ ] HMACHINE hM = Connect ("MY_SERVER")
	[ ] SetMachine (hM)
	[ ] 
	[ ] HFILE hFile = SYS_FileOpen ("c:\file.txt", FM_WRITE)
	[ ] SYS_FileClose (hFile)

 

Еще функции для работы с файлами:

  • SYS_FileExists – проверяет, существует ли файл
  • SYS_CopyFile – копирование файла. Если файл уже существует в папке, куда осуществляется копирование, сгенерируется исключение E_SYSTEM: “*** Error: File ‘…’ already exists”
  • SYS_MoveFile – перенос файла. Генерируется исключение если файл-источник не существует, либо файл-приемник уже существует
  • SYS_RemoveFile – удаление файла. Файл не должен иметь аттрибутов “Только для чтения”, “Скрытый” и “Системный”

 

Кроме того, в SilkTest-e существует группа функций для работы с ini-файлами, однако они рассмотрены ниже в главе 11.2.2 Работа с ini-файлами

11.1.2 Работа с каталогами

Для работы с каталогами в SilkTest-e предусмотрены следующие функции:

  • SYS_GetDir – возвращает текущий (рабочий) каталог
  • SYS_SetDir – устанавливает текущий (рабочий) каталог
  • SYS_MakeDir – создать новый каталог (только одного уровня вложенности, т.е. если вы захотите создать каталог One, а в нем каталог Two, то вам придется вызвать эту функцию дважды)
  • SYS_RemoveDir – удаляет каталог (только если он пустой, в противном случае из него необходимо удалить все файлы и вложенные каталоги)
  • SYS_DirExists – проверяет, существует ли каталог; возвращает TRUE, если каталог существует
  • SYS_GetDirContents – возвращает содержимое каталога. Возвращаемый тип – список LIST OF FILEINFO. Тип FILEINFO содержит в себе все параметры файла: имя, размер, аттрибуты и т.д.
  • SYS_GetExecutableDir – возвращает местоположение файла agent.exe
  • SYS_GetDrive, SYS_SetDrive – возвращают и устанавливают текущий диск соответственно

 

В качестве примера работы с каталогами приведем функцию, которая позволяет удалять каталоги вместе со всем их содержимым:

Code

[-] void RemoveDir (STRING sDir)
	[ ] LIST OF FILEINFO lfInfo
	[ ] INTEGER i
	[ ] STRING sPrevDir
	[-] if(SYS_DirExists(sDir))
		[ ] SYS_SetDir(sDir)
		[ ] lfInfo = SYS_GetDirContents(sDir)
		[-] for i = 1 to ListCount(lfInfo)
			[-] if(lfInfo[i].bIsDir)
				[ ] sPrevDir = SYS_GetDir()
				[ ] RemoveDir (SYS_GetDir() + "\" + lfInfo[i].sName)
				[ ] SYS_SetDir(sPrevDir)
			[-] else
				[ ] SYS_RemoveFile(lfInfo[i].sName)
		[ ] SYS_SetDir (GetExecutableDir ())
		[ ] SYS_RemoveDir (sDir)

В приведенной функции есть одна особенность: если какой-либо из файлов имеет аттрибут “Только для чтения”, “Скрытый” или “Системный”, то сгенерируется исключение “*** Error: Permission denied to ‘…'” для этого файла. Для того, чтобы все же удалять и такие файлы, необходимо воспользоваться WinAPI функцией SetFileAttributesA из файла kernel32.dll прежде, чем удалять файл, в самом начале цикла for (подробнее о DLL и WinAPI смотри главу 11.6 Использование Windows API и DLL)

11.2 Работа с реестром и ini-файлами

SilkTest имеет широкие возможности для работы с реестром и ini-файлами. И хотя в справке по SilkTest-у работа с ini-файлами рассматривается в разделе “Работа с файлами”, мы решили совместить их описание в одном разделе с описанием работы с реестром, так как и то, и другое используется приложениями с одной целью: для сохранения данных в более-менее универсальном виде.

11.2.1 Работа с реестром

Функции для работы с реестром определены в файле Registry.inc, который находится в папке, где установлен SilkTest (обычно “C:\Program Files\Segue\SilkTest”). Однако по умолчанию этот файл не подключен как Use File. Если вам необходимо работать с реестром необходимо, прежде всего, подключить этот файл в диалоговом окне Runtime Options, либо с помощью дерективы use.

Ниже перечислены функции для работы с реестром. Первый параметр для всех этих функций – это целочисленное значение, соответствующее определенному разделу реестра (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE и т.д.). Константы с соответствующими именами определены в файле mswconst.inc.

  • Reg_CreateKey (hRootKey, sKeyPath) – создает новый раздел (Key) вместе с подразделами (если не существовали)
  • Reg_DeleteKey (hRootKey, sPath) – удаляет существующий раздел
  • Reg_DeleteKeysAll (hRootKey, sPath) – удаляет существующий раздел вместе с подразделами и значениями (Value)
  • Reg_CreateValue (hRootKey, sPath, sValueName, sValueData) – создает новое значение sValueName в разделе sPath
  • Reg_DeleteValue (hRootKey, sPath, sValueName) – удаляет существующее значение sValueName
  • Reg_EnumKeys (hRootKey, sPath) – возвращает список всех подразделов в указанном разделе
  • Reg_EnumKeysAll (hRootKey, sPath) – возвращает список всех подразделов в указанном разделе и во всех имеющихся в нем подразделов
  • Reg_EnumValues (hRootKey, sPath) – возвращает список всех значений в указанном разделе
  • Reg_EnumValuesAll (hRootKey, sPath) – озвращает список всех значений в указанном разделе и во всех имеющихся в нем подразделов
  • SYS_GetRegistryValue (iKey, sPath, sItem [, bConvert]) – возвращает величину указанного значения
  • SYS_SetRegistryValue (iKey, sPath, sItem, sValue) – устанавливает значение

Ниже показан пример, в котором создается новый раздел в корневом разделе HKEY_CURRENT_USER, затем в нем создаются новые значения, выводятся на печать, после чего все созданное скриптом удаляется из реестра.

 

Code

	[ ] Print ("* * * Creating Keys and Values")
	[ ] Reg_CreateKey (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2")
	[ ] Reg_CreateValue (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2", "StringValue", "Test_String")
	[ ] Reg_CreateValue (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2", "DWORDValue", "REG_DWORD: 0x1a")
	[ ] Reg_CreateValue (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1", "BinaryValue", "REG_BINARY: 01 13 7a")
	[ ] 
	[ ] Print ("* * * Reading Data from Values in Key 'Test_SubKey2'")
	[ ] ListPrint (Reg_EnumValues (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2"))
	[ ] 
	[ ] Print ("* * * Reading Data from Values in Key 'Test_Key' and below")
	[ ] ListPrint (Reg_EnumValuesAll (HKEY_CURRENT_USER, "Test_Key"))
	[ ] 
	[ ] Print ("* * * Reading Data from Key 'Test_SubKey1' and below")
	[ ] ListPrint (Reg_EnumKeys (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1"))
	[ ] 
	[ ] Print ("* * * Reading Data from Key 'Test_Key' and below")
	[ ] ListPrint (Reg_EnumKeysAll (HKEY_CURRENT_USER, "Test_Key"))
	[ ] 
	[ ] Print ("* * * Reading Value 'DWORD'")
	[ ] Print (SYS_GetRegistryValue (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2", "DWORDValue"))
	[-] 
	[ ] Print ("* * * Deleting DWORD Value")
	[ ] Reg_DeleteValue (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2", "DWORDValue")
	[ ] 
	[ ] Print ("* * * Deleting Test_SubKey2 Key")
	[ ] Reg_DeleteKey (HKEY_CURRENT_USER, "Test_Key\Test_SubKey1\Test_SubKey2")
	[ ] 
	[ ] Print ("* * * Deleting Test_Key Key")
	[-] Reg_DeleteKeysAll (HKEY_CURRENT_USER, "Test_Key")

 

11.2.2 Работа с ini-файлами

Для работы с ini-файлами в SilkTest-e предусмотрены следующие функции:

  • IniFileOpen (sFile [, ftType]) – открывает файл для чтения и записи.Возвращает переменную типа HINIFILE
  • IniFileClose (hIniFile) – закрывает ранее открытый ini-файл
  • IniFileGetValue (hIniFile, sSection, sName) – возвращает строковое значение для заданной секции (sSection) и строки (sName)
  • IniFileSetValue (hIniFile, sSection, sName, sValue) – устанавливает строковое значение sValue для заданной секции (sSection) и строки (sName)

В следующем примере создается новый файл c:\file.ini (или открывается существующий), после чего в секцию new_section для строки new_value записывается случайно сгенерированная строка, после чего она считывается и выводится в файл результата:

 

Code

	[ ] HINIFILE hIni = IniFileOpen ("c:\file.ini")
	[ ] IniFileSetValue (hIni, "new_section", "new_value", RandStr ("X(10)"))
	[ ] Print (IniFileGetValue (hIni, "new_section", "new_value"))
	[-] IniFileClose (hIni)

 

11.3 Использование проектов

В SilkTest-e существует понятие “Проект”. В проект можно добавлять любые файлы, которые относятся к текущему проекту и могут понадобиться во время работы. Удобство проета заключается в том, что открыть нужный файл проще из списка файлов в окне проекта, чем искать его на диске, используя диалог открытия файла (File – Open). Кроме того, гораздо быстрее осуществляется доступ к используемым в подключенных к проету файлах классам, функциям, константам, аппстейтам и т.д.

К недостаткам проекта можно отнести тот факт, что окно проекта всегда занимает часть экрана SilkTest-a, что уменьшает видимую часть текущего открытого файла. Кроме того, окно проекта может мешать людям, которые просто привыкли всегда открывать файлы через меню File – Open, т.к. для них это окно будет просто бесполезно.

Для создания нового проекта необходимо выбрать пункт меню File – New Project. После чего можно выбрать пункт “AutoGenerate Project”, либо “Create Project”. В первом случае SilkTest попросит указать файл, из которого будут браться ссылки на файлы для нового проекта (файлы тестплана по умолчанию), во втором случае необходимые файлы придется добавлять вручную. При создании нового проекта в папке, которую вы указываете в окне диалога “Create Project”, будет создана новая папка с именем, соответствующим имени нового проекта, куда и будут помещены файлы проекта (ini-файл и vtp-файл). Для создания проекта TestApp мы использовали второй вариант.

Обратите внимание: при переносе файлов проекта на другую машину, или просто на другой диск/в другую папку, необходимо сделать изменения в файле *.vtp. В разделе [ProjectProfile] параметр ProjectIni должен быть полным путем к INI-файлу, который находится в той же папке, что и файл проекта. Относительный путь для этого параметра недопустим.

11.4 Сохранение и использование сохраненных настроек

В SilkTest-e существует возможность сохранить имеющиеся настройки для дальнейшего их использования (например, при запусках на других машинах). Эти настройки хранятся в *.opt файлах. По умолчанию настройки SilkTest-a хранятся в файле partner.ini, который находится в папке, где установлен SilkTest. Информация о подключенных расширениях хранится в двух местах: для host machine – в partner.ini, для target machine – в файле extend.ini в той же папке.

Для сохранения текущих настроек в отдельном *.opt файле необходимо выбрать пункт меню Options – Save New Options Set, после чего указать имя и местоположение файла. В итоге будет создан файл, в котором хранятся все настройки SilkTest-a. Для открытия ранее сохраненных настроек необходимо выбрать пункт меню Options – Open Options Set и выбрать необходимый файл.

Для того, чтобы вернуться к настройкам по умолчанию, необходимо закрыть текущий Options Set с помощью пункта меню Options – Close Options Set. При использовании расширений кроме подключения файла настроек (*.opt) также придется копировать в папку SilkTest-a требуемый файл extend.ini, чтобы подключить настройки для target machine.

Кроме того, можно подключать файл настроек во время запуска SilkTest-a из командной строки. Подробнее о параметрах командной строки см. раздел 11.5 Параметры командной строки SilkTest-a.

11.5 Параметры командной строки SilkTest-a

Иногда полезно запускать SilkTest из командной строки (например, для запуска тестирования в определенное время). Ниже перечислены параметры командной строки файла partner.exe, который является запускаемым файлом для SilkTest-a.

Общий формат командной строки выглядит так:

Code

partner.exe [опции] имя_файла [аргументы]

Опции могут быть следующими:

  • -complog <filename.txt> – при указании этой опции SilkTest будет писать в указанный файл filename.txt ошибки компиляции, которые возникают во время работы скрипта/тестплана
  • -m <target_machine_name> – указывает target machine. на которой будет произведен запуск. По умолчанию используется local. Для того, чтобы эта опция сработала, необходимо, чтобы в настройках SilkTest-a (Options – Runtime – Network) был включен один из протоколов (TCP/IP или NetBIOS), или чтобы данная опция была прописана в подключаемом *.opt файле (см. ниже)
  • -opt <opt_file_name> – позволяет производить запуск с подключенным файлом опций opt_file_name
  • -p – используется в случае, если SilkTest вызывается из другой программы в режиме “batch job”, позволяя ей получать сообщения о количестве ошибок, произошедших в скрипте
  • -proj <project_name> – позволяет открыть erfpfyysq проект project_name при запуске SilkTest-a
  • -q – закрыть SilkTest после завершения работы скрипта/тестплана
  • -query <query_name> – указывает запрос query_name, который должен выполниться при запуске тестплана
  • -r <testplan/script_name> – эта опция должна указываться последней в списке опций. Непосредственно после нее должно быть имя скрипта/тестплана, который необходимо запустить
  • -resexport – автоматически экспортировать суммарную информацию по прошедшим тесткейсам в *.rex файл. Указание этой опции аналогично действию функции ResExportOnClose
  • -resextract – автоматически экспортировать суммарную информацию по прошедшим тесткейсам в *.txt файл.
  • [аргументы] – в этой части командной строки можно перечислить аргументы, передаваемые в скрипт. Внутри тесткейсов эти аргументы можно получить с помощью функции GetArgs(), которая возвращает список переданных строк. Если параметр состоит из более чем одного слова, необходимо заключить его в двойные кавычки.

 

Ниже показан пример, который запускает SilkTest, подключает *.opt файл, подключается к компьютеру RUNSERVER через порт 1111, запускает скрипт notepad.t с одним параметром “Test Args”, после чего закрывает SilkTest. Ошибки компиляции пишутся в файл errors.txt, суммарная информация выводится в файл notepad.txt.

Code

partner.exe -q -opt c:\options.opt -complog c:\errors.txt -m RUNSERVER:1111 -resextract -r C:\notepad.t "Test agrs"

 

В SilkTest-е начиная с версии 8.0 появились еще два параметра командной строки:

  • -smlog <file_name> – позволяет сохранять сообщения SilkMeter-а в указанном файле
  • -quiet – запускает SilkTest в “тихом режиме”, при котором блокируются всплывающие окна SilkMeter-a. Этот параметр рекомендуется использовать в том случае, если тестирование происходит в полностью автоматическом режиме, когда пользователь не имеет возможности отреагировать на появляющиеся сообщения SilkMeter-a. При использовании этого параметра также рекомендуется использовать предыдущий параметр smlog.

 

11.6 Использование Windows API и DLL

Возможности SilkTest-a широки, однако при тестировании практически всегда возникают задачи, которые невозможно решить встроенными средствами. Для таких случаев SilkTest предоставляет возможность использовать функции Windows API, а также любые функции из DLL-файлов.

Общий вид объявления функции выглядит так:

Code

[+] dll dllname.dll
	[ ] [return-type] func-name ( [arg-list] ) [alias dll-fname]

где:
dllname.dll – собственно имя dll файла, функции которого предполагается использовать
return-type – возвращаемый тип. Необязательный параметр
func-name – имя функции. Может отличаться от имени, которое указано в DLL. Если имя функции
указывается другое, то необходимо указать последний параметр alias arg-list – список принимаемых аргументов. Необязательный параметр
alias dll-fname – имя функции, как оно указано в DLL. Указывается только в том случае, если имя func-name отличается от оригинального имени функции.

Простейший пример функции, которая блокирует рабочую станцию:

Code

[-] dll "user32.dll"
	[ ] long LockComputer () alias "LockWorkStation"
[ ] 
[-] main ()
	[ ] LockComputer ()

При запуске данной функции main компьютер будет заблокирован. Мы использовали новое имя LockComputer лишь для демонстрации того, как это сделать. Некоторые из функций уже описаны в файле mswfun32.inc. Для того, чтобы получить к ним доступ, необходимо подключить к Use файлам файл msw32.inc, который подключает все необходимые файлы.

В качестве еще одного примера приведем функцию для извлечения цвета пикселя. Для этого нам потребуются две API функции: первая из них извлекает ссылку на контекст устройства (Handle to a display device context, HDC), используя Window ID, а вторая извлекает собственно цвет пикселя по известному HDC. Для того, чтобы каждый раз затем не вызывать обе этих функции по очереди, мы напишем простую функцию GetPixelColor, которая будет принимать в качестве аргументов Window ID и координаты пикселя, цвет которого необходимо узнать.

Code

[-] dll "user32.dll"
	[ ] LONG GetDC(HWND hWnd)
[-] dll	"gdi32.dll"
	[ ] LONG GetPixel(LONG hdc,INT x,INT y)
[ ] 
[-] LONG GetPixelColor (HWND hWnd, INT x, INT y)
	[ ] return GetPixel (GetDC (hWnd), x, y)

 


Назад Содержание Дальше