powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
19 сообщений из 19, страница 1 из 1
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35492510
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Чтобы юзать под фоксой WinAPI, о фунциях которого можно почитать на MSDN , я постоянно сталкиваюсь с одной проблемой - там описывается функция, и почти всегда для нее есть какие-то флаги, названные зарезервированным "словом", за которыми стоят числа. Когда я буду юзать такую функцию под фоксой, мне необходимо заранее знать их числовые значения, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	  #DEFINE SND_SYNC  0 
	  #DEFINE SND_ASYNC  1 
	  #DEFINE SND_NODEFAULT  2 
	  #DEFINE SND_MEMORY  4 
	  #DEFINE SND_LOOP  8 
	  #DEFINE SND_NOSTOP  16 

	  DECLARE INTEGER sndPlaySound IN winmm STRING lpszSound, INTEGER fuSound
	  
	  sndPlaySound(m.lcTempFile,SND_ASYNC)
т.е. эти самые флаги, числовые значения которых необходимо знать заранее здесь:
Код: plaintext
1.
2.
3.
4.
5.
	  SND_SYNC
	  SND_ASYNC
	  SND_NODEFAULT
	  SND_MEMORY
	  SND_LOOP
	  SND_NOSTOP

Вопрос - где или как можно узнать какие значения стоят за подобными флагами? Может есть ли какой-то ресурс, на той же MSDN или еще где-то? Или можно как-то это через другую функцию выньапи узнать или еще как-то?

спасибо
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35492587
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если стоит MS VC++ то делаешь поиск в подпапке Include и находишь *.h файл где эта константа объявлена. В данном случае:
MMSystem.h ...
#define SND_SYNC 0x0000 /* play synchronously (default) */
#define SND_ASYNC 0x0001 /* play asynchronously */
#define SND_NODEFAULT 0x0002 /* silence (!default) if sound not found */
#define SND_MEMORY 0x0004 /* pszSound points to a memory file */
#define SND_LOOP 0x0008 /* loop the sound until next sndPlaySound */
#define SND_NOSTOP 0x0010 /* don't stop any currently playing sound */
...
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35492654
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а поскольку C или его наследники, как правило, не стоят, то ищешь значения констант по интернету.

Насколько я знаю, на сайте Microsoft в открытом доступе этих заголовочных файлов нет (файлов, с расширенем из одной буквы h). И значений констант тоже нигде нет. Вот как хочешь, так и ищи...
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35492702
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНасколько я знаю, на сайте Microsoft в открытом доступе этих заголовочных файлов нет
Есть вроде:
Windows SDKThe Windows SDK for Windows Server® 2008 and .NET Framework 3.5 provides documentation, samples, header files , libraries, and tools designed to help you develop Windows applications using both native ( Win32 ®) and managed (.NET Framework) technologies.

Только там кроме хэдеров еще 1.3 Гб всякой всячины.

Если кому надо могу в мыло кинуть. Их 40 Мб (3.5 Мб в архиве)
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35493510
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вот так вот постоянно и рыскаю по инету в поисках, блин. И причем не всегда успешно.

2Dima_T - вышли мне на мыло, пожалуйста :)
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35493878
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выслал
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35495175
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо еще раз.
А мож подскажете в догонку как этот сионисткий код на вфп переводится:
Код: plaintext
1.
#define SND_ALIAS       0x00010000L 
(DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) <<  8 )
Переменные заданы ch0 = "S" и ch1 = "D"

функция | - это BITOR
<< BITLSHIFT?
(DWORD) - наверное STRCONV(cVar,1)
(BYTE) - ASC()?
т.е.

Код: plaintext
BITOR( STRCONV(ASC(chr0), 1 ), BITLSHIFT(STRCONV(ASC(chr1), 1 ), 8 ) )

а что получается с 0x00010000L? L означает младший разряд, но как в фоксе его получить? типа через MOD(0x00010000,65536)?
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35495197
Aptex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://]http://www.news2news.com/vfp/w32constants.php?tpl=INTERNET_OPEN_TYPE_D&mode=1
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35495301
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOспасибо еще раз.
А мож подскажете в догонку как этот сионисткий код на вфп переводится:
Код: plaintext
1.
#define SND_ALIAS       0x00010000L 
(DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) <<  8 )


Ты цитируй построчно хотя бы, а не кусками. Если тебе синтаксис не понятен, не запутывай других. Там вроде так написано:
MMSystem.h#define SND_ALIAS 0x00010000L /* name is a registry alias */
...
#define SND_ALIAS_START 0 /* alias base */
...
#define sndAlias(ch0, ch1) (SND_ALIAS_START + (DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8))
0x00010000L = 0x00010000 = 65536 (Буква L - обозначает что делать четырехбайтовое значение)

sndAlias(ch0, ch1) - это уже макрос, а не константа. Означает следующее:
Код: plaintext
 0  + mod(ch0,  256 ) + mod(ch1,  256 ) *  256 
(DWORD), (BYTE) - это приведение типов
DWORD - четырехбайтовое беззнаковое целое, т.е. остаток от деления на 2^32
BYTE - однобайтовое беззнаковое целое, т.е. остаток от деления на 256 => mod(X, 256) или X % 256

PS Может все-таки тебе уже Си осваивать пора? Писать там DLL-ки и их юзать из фокса.
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35495981
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!

Си оно конечно хорошо бы освоить, но если я за 5 лет толком и вфп-то не освоил, что уж про си говорить...

по последнему вопросу: дословно получается так:
Код: plaintext
 0  +BITOR(MOD(MOD(ASC(chr0), 256 ), 65536 ) , BITLSHIFT(MOD(MOD(ASC(chr1), 256 ), 65536 ), 8 ))
однако Ваша версия
Код: plaintext
 0  + mod(ASC(chr0),  256 ) + mod(ASC(chr1),  256 ) *  256 
правильно упрощена, и дает на выходе тот же результат.

ведь chr0 и chr1 - строковые, над ними нельзя же просто сделать mod

допустим я хочу проиграть звук SYSTEMSTART по его алиас_ИД. Я там проще нашел путь, но хочется добить этот вариант.
вот строчки дефайнов
Код: 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.
/*
 *  flag values for fuSound and fdwSound arguments on [snd]PlaySound
 */
#define SND_SYNC            0x0000  /* play synchronously (default) */
#define SND_ASYNC           0x0001  /* play asynchronously */
#define SND_NODEFAULT       0x0002  /* silence (!default) if sound not found */
#define SND_MEMORY          0x0004  /* pszSound points to a memory file */
#define SND_LOOP            0x0008  /* loop the sound until next sndPlaySound */
#define SND_NOSTOP          0x0010  /* don't stop any currently playing sound */

#define SND_NOWAIT      0x00002000L /* don't wait if the driver is busy */
#define SND_ALIAS       0x00010000L /* name is a registry alias */
#define SND_ALIAS_ID    0x00110000L /* alias is a predefined ID */
#define SND_FILENAME    0x00020000L /* name is file name */
#define SND_RESOURCE    0x00040004L /* name is resource name or atom */

#define SND_ALIAS_START  0            /* alias base */

#define sndAlias(ch0, ch1)      (SND_ALIAS_START + (DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) <<  8 ))

#define SND_ALIAS_SYSTEMASTERISK        sndAlias('S', '*')
#define SND_ALIAS_SYSTEMQUESTION        sndAlias('S', '?')
#define SND_ALIAS_SYSTEMHAND            sndAlias('S', 'H')
#define SND_ALIAS_SYSTEMEXIT            sndAlias('S', 'E')
#define SND_ALIAS_SYSTEMSTART           sndAlias('S', 'S')
#define SND_ALIAS_SYSTEMWELCOME         sndAlias('S', 'W')
#define SND_ALIAS_SYSTEMEXCLAMATION     sndAlias('S', '!')
#define SND_ALIAS_SYSTEMDEFAULT         sndAlias('S', 'D')
вот как вызывается
Код: plaintext
PlaySound((LPCTSTR)SND_ALIAS_SYSTEMSTART, NULL, SND_ALIAS_ID);
Получается что макрос sndAlias вызывается с параметрами ('S', 'S'), т.е. строковыми. Как понять привидение буквы 'S' к типу BYTE, который числовой? Я предполагаю что берется его CHR код, т.е. в вфп ASC('S'). Опять же функция (LPCTSTR) для чего? Для перевода числа в строковый тип, так?

чему же реально получится равен SND_ALIAS_SYSTEMSTART? У меня выходит 21331, но звука нет :(
хотя через упомянутый более простой путь - играет:
Код: plaintext
PlaySound('SystemStart', NULL, SND_ALIAS)

значит 21331 - неправильный результат?
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35496137
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал про этот PlaySound() в MSDN. Без бутылки не разобраться и самплесов нет. Извращенцы разработчики этой функции

Попробуй еше так:
Код: plaintext
PlaySound("SS",  0 , SND_ALIAS_ID)
и так
Код: plaintext
PlaySound(сhr( 0 ) + chr( 0 ) + "SS",  0 , SND_ALIAS_ID)
типы параметров в фоксе STRING, INTEGER, INTEGER

Покажи еще код как ты ее вызываешь из фокса.
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35496149
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SND_ALIAS_ID = 0x00110000 = 1114112
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35496811
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запускаю вот так:
Код: 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.
#define SND_SYNC            0x0000  &&/* play synchronously (default) */
#define SND_ASYNC           0x0001  &&/* play asynchronously */
#define SND_NODEFAULT       0x0002  &&/* silence (!default) if sound not found */
#define SND_MEMORY          0x0004  &&/* pszSound points to a memory file */
#define SND_LOOP            0x0008  &&/* loop the sound until next sndPlaySound */
#define SND_NOSTOP          0x0010  &&/* don't stop any currently playing sound */

#define SND_NOWAIT      0x00002000 &&/* don't wait if the driver is busy */
#define SND_ALIAS       0x00010000 &&/* name is a registry alias */
#define SND_ALIAS_ID    0x00110000 &&/* alias is a predefined ID */
#define SND_FILENAME    0x00020000 &&/* name is file name */
#define SND_RESOURCE    0x00040004 &&/* name is resource name or atom */
 
#define SND_ALIAS_START  0            &&/* alias base */

DECLARE INTEGER PlaySound IN winmm;
	  STRING pszSound,;
	  INTEGER hmod,;
	  LONG fdwSound

chr0='S'
chr1='S'

PlaySound( TRANSFORM( SND_ALIAS_START + BITOR( MOD(ASC(chr0), 256 ) , BITLSHIFT(MOD(ASC(chr1), 256 ), 8 ) ));
			,  0 , SND_ALIAS_ID)
варианты типа
Код: plaintext
1.
PlaySound("SS",  0 , SND_ALIAS_ID)
PlaySound(сhr( 0 ) + chr( 0 ) + "SS",  0 , SND_ALIAS_ID)
не пашут, но оно и понятно - там должно быть число, приведенное в строчный тип, типа "21331"
а на мсдн таки есть примеры и даже по алиас_ид есть
мсднThe following example plays a system-event sound:
Код: plaintext
PlaySound(TEXT("SystemStart"), NULL, SND_ALIAS);

The following example is equivalent to the previous example, but uses an identifier for the system event:
Код: plaintext
PlaySound((LPCTSTR)SND_ALIAS_SYSTEMSTART, NULL, SND_ALIAS_ID);
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35496838
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aptex news2news спасибо, там тоже все есть (наверное прямо по .Н-файлам ищет), и в большинстве случаев поможет, но, к примеру, по рассматриваемой фукнции с сайта можно только узнать, что
Код: plaintext
SND_ALIAS_SYSTEMSTART = sndAlias('S', 'S')
а вот что за sndAlias оттуда уже ответа не получишь, и это странно, т.к. он точно так же стоит за #define...
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35496989
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так работает:
Код: plaintext
1.
2.
DECLARE integer PlaySound in Winmm.dll integer, integer, integer
PlaySound(asc('S') + asc('S') *  256 ,  0 ,  1114112 )

Почему так: первый параметр может быть как четырехбайтовое целое (INTEGER в фоксе), так и указатель на строку (STRING в фоксе) - это четырехбайтовый адрес в памяти, по которому лежит символьная строка заканчивающаяся нулем. Что ждет функция в первом параметре зависит от 3-го.

Конструкция X | (Y << 8) при однобайтовых целых X и Y (от 0 до 255) равнозначна X + Y * 2^8 только операции | (побитовое ИЛИ) и << (сдвиг влево на N бит) выполняются процессором гораздо быстрее чем сложение и тем более умножение.

Думаю все-таки Си (не С++) тебе надо поизучать, хотя бы в части типы данных, т.к. преобразования там далеко не такие как в фоксе.
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35497026
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
#define SND_ALIAS_START  0            /* alias base */
#define sndAlias(ch0, ch1)      (SND_ALIAS_START + (DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) <<  8 ))

На фоксе будет так
Код: plaintext
1.
2.
Func sndAlias
lpara tcCh0, tcCh1
return asc(tcCh0) + asc(tcCh2) *  256 
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35497072
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного про тип BYTE:
это не тип Си а тип MS Си :)
Означает однобайтовое беззнаковое целое. Реально это Сишный тип unsigned char
char в Си это тип для хранения кода символа. Т.е. запись 'A' означает код символа 'A' это число 65 и соответственно 'A' + 'A' = 130 а не строка "AA"
Типа строка в Си вообще нет, есть указатель на массив символов (LPSTR или LPСSTR)
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35497260
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак работает:
Код: plaintext
1.
2.
DECLARE integer PlaySound in Winmm.dll integer, integer, integer
PlaySound(asc('S') + asc('S') *  256 ,  0 ,  1114112 )
по ходу получается что в моем примере достаточно было просто первый параметр объявить как INTEGER и все. Ну и TRANSFORM убрать.

мде, весело получается. в зависимости от того что хочешь проиграть и декларить нада соответственно... ну я, конечно, по алиас_ид не буду играть, ну его нафиг такие сложности, но ценный опыт трансляции кода с Си получил, за что спасибо!
...
Рейтинг: 0 / 0
Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
    #35498237
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чета вы перемудрили
Код: plaintext
1.
2.
Declare integer sndPlaySound in WinMM.DLL string, integer
sndPlaySound("SystemStart", 1 )
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по WinAPI: как или где можно узнать реальные значения флагов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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