Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WinAPI / 3 сообщений из 3, страница 1 из 1
26.09.2003, 16:02
    #32277002
artuha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI
Я раньше программировал на Delphi и использовал множество API функций. Можно ли те же функции использовать под FoxPro???
...
Рейтинг: 0 / 0
26.09.2003, 16:14
    #32277033
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI
Можно, но зачастую много сложнее, чем в Delphi.

Для начала DLL-библиотека должна быть подключена командой DECLARE-DLL.

Очень большая проблема заключается в том, что многие DLL принимают в качестве параметра некоторую структуру. А FoxPro не работает со структурами. Т.е. необходимо вместо структуры передавать и принимать обычную символьную строку в которой побайтно и конструировать эту структуру. Правда, в VFP8 вроде бы наметился некоторый прогресс в этом смысле.

Посмотри сайт

http://www.news2news.com/vfp/index.php

Там в бесплатных примерах можешь посмотреть простейшие случаи использования DLL (за более сложные там надо платить)
...
Рейтинг: 0 / 0
07.10.2003, 11:14
    #32285948
WinAPI
Пример использования WinApi функций для получения информации о версии файлов, сделана еще на VFP 5.
Есть здесь и структуры и много чего еще интересного ;)
Что непонятно будет спрашивайте.
Переменные, нарисованные только заглавными буквами, определены в h-файле,
его я не стал сюда перерисовывать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
*************************************************************
FUNCTION GetFileVersion (tcFileName, taVersion)
*************************************************************
*!*	Читает информацию о файле из файла
*!*		tcFileName - имя файла
*!*		@taVersion - массив для записи информации
*!*		             передается по ссылке
*************************************************************
*!*	Что читаем о файле в массив ?
*************************************************************
*!*		Comments
*!*		CompanyName
*!*		FileDescription
*!*		FileVersion
*!*		InternalName
*!*		LegalCopyright
*!*		LegalTrademarks
*!*		OriginalFileName
*!*		PrivateBuild
*!*		ProductName
*!*		ProductVersion
*!*		SpecialBuild
*!*		Язык
*!*		Кодовая страница
*************************************************************
*!*	Проверяем - а есть ли такой файл
IF type( "tcFileName" ) <>  "C"  or adir(aDir,tcFileName, "AHRS" ) =  0 
	tcFileName =  ""
	tcFileName = GetFile()
	if empty(tcFileName)
		RETURN ERR_FILE_NOT_FOUND
	endif
ENDI

LOCAL lnRC, lnBufferLen, lnDummy

*!*	Пытаемся прочесть размер информации о версии файла
lnDummy = 0 
lnBufferLen = GetFileVersionInfoSize( tcFileName, @lnDummy)
IF lnBufferLen <  1 
	RETURN ERR_NO_VERSIONINFO
ENDIF

*!*	Пытаемся прочесть информацию о версии файла
LOCAL lsBuffer
lsBuffer = repl(chr( 0 ), lnBufferLen)
lnRC = GetFileVersionInfo( tcFileName ;
	,  0  ;
	, lnBufferLen ;
	, @lsBuffer)
IF lnRC =  0 
	RETURN ERR_NO_VERSIONINFO
ENDIF

*!*	Пытаемся определить на каком языке информация о версии файла
LOCAL lcVerPointer, lcBufferLen, lnVerPointer
lcVerPointer = repl(chr( 0 ), 4 )
lcBufferLen  = repl(chr( 0 ), 4 )
lnVerPointer =  0 
lnBufferLen  =  0 
lnRC = VerQueryValue( @lsBuffer ;
	, "\VarFileInfo\Translation " ;
	, @lcVerPointer ;
	, @lcBufferLen)
IF lnRC = 0 
	RETURN ERR_NO_TRANSLATION
ENDIF
lnVerPointer = str2dword(lcVerPointer)
lnBufferLen  = str2dword(lcBufferLen)

LOCAL lbBuffer
lbBuffer = repl(chr( 0 ),lnBufferLen)
MoveMemory( @lbBuffer, lnVerPointer, lnBufferLen)

LOCAL lcLang_Charset_String
LOCAL lnHexNumber, lnHexLangId, lnHexCodePage

lnHexLangId = asc(substr(lbBuffer, 1 , 1 )) ;
	+ asc(substr(lbBuffer,  2 ,  1 )) * 0x100
lnHexCodePage = asc(substr(lbBuffer,  3 ,  1 )) ;
	+ asc(substr(lbBuffer,  4 ,  1 )) * 0x100
*!*	lnHexNumber = lnHexLangId * 0x10000 + lnHexCodePage

lnHexNumber = asc(substr(lbBuffer,  3 ,  1 )) ;
	+ asc(substr(lbBuffer,  4 ,  1 )) * 0x100 ;
	+ asc(substr(lbBuffer,  1 ,  1 )) * 0x10000 ;
	+ asc(substr(lbBuffer,  2 ,  1 )) * 0x1000000

lcLang_Charset_String = substr(transform(lnHexNumber, "@ 0  "), 3 )

DO While Len(lcLang_Charset_String) <  8 
	lcLang_Charset_String = " 0  " + lcLang_Charset_String
ENDDO

DIMENSION taVersion[VERSIONS_NUMBER + 2 ]
LOCAL array laVersionInfo[VERSIONS_NUMBER]
laVersionInfo[  1 ] = "Comments "
laVersionInfo[ 2 ] = "CompanyName "
laVersionInfo[ 3 ] = "FileDescription "
laVersionInfo[ 4 ] = "FileVersion "
laVersionInfo[ 5 ] = "InternalName "
laVersionInfo[ 6 ] = "LegalCopyright "
laVersionInfo[ 7 ] = "LegalTrademarks "
laVersionInfo[ 8 ] = "OriginalFileName "
laVersionInfo[ 9 ] = "PrivateBuild "
laVersionInfo[10 ] = "ProductName "
laVersionInfo[11 ] = "ProductVersion "
laVersionInfo[12 ] = "SpecialBuild "

*!*	Читаем известную нам информацию о версии файла
LOCAL lnI, lsTemp, lcBuffer
FOR lnI = 1  To VERSIONS_NUMBER
	lcBuffer = repl(chr( 0 ),  255 )
	lsTemp = "\StringFileInfo\ " ;
		+ lcLang_Charset_String ;
		+ " \ " ;
		+ laVersionInfo[lnI]
	lcVerPointer = repl(chr(0 ),  4 )
	lcBufferLen  = repl(chr( 0 ),  4 )
	lnRC = VerQueryValue( @lsBuffer, ;
		lsTemp, ;
		@lcVerPointer, ;
		@lcBufferLen)
	IF lnRC =  0  Then
		taVersion[lnI] = ""
		LOOP
	ENDIF

	lnVerPointer = str2dword(lcVerPointer)
	lnBufferLen  = str2dword(lcBufferLen)
	MoveMemory( @lcBuffer, lnVerPointer, lnBufferLen)
	taVersion[lnI] = left(lcBuffer, lnBufferLen -  1 )
ENDF

lnBufferLen = VerLanguageName( lnHexLangId, @lcBuffer, len(lcBuffer))
taVersion[VERSIONS_NUMBER +  1 ] = left(lcBuffer, lnBufferLen)
taVersion[VERSIONS_NUMBER +  2 ] = allt(str(lnHexCodePage))

RETURN ERR_NO_ERRORS
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WinAPI / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]