Злая функция PlaySound

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Злая функция PlaySound

Сообщение Киска » 28.11.2006 (Вт) 6:05

Сижу, вот, ковыряюсь с ф-й
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Вызываю Call PlaySound(PathSound, 0, 1) - звук играет
Теперь хочу прервать звук, вызываю:
Call PlaySound("", 0, 64)
Звук продолжает играть! Звук - wav файл. Вместо первого параметра ставлю "" или 0. Вместо третьего параметра ставлю то 0, то 1, то 64. Испробовала все комбинации, ничего не получается, звук играется!
Если вместо первого параметра ставить 0, то комп ещё и пикает! Но звук не останавливается! Злая, как чёрт! :twisted: Всё, ложусь спать :(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.11.2006 (Вт) 6:30

vbNullString не пробовала?
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 28.11.2006 (Вт) 11:04

О, класс! Работает! Спасибо, Тёмыч! А чем vbNullString отличается от пустой строки ""?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 28.11.2006 (Вт) 11:09

Мне, кстати, интересно, а почему 0 не работает аналогично vbNullString?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.11.2006 (Вт) 11:15

Видимо потому, что для использования 0, надо параметр объявить как Long вместо String.

2 Киска, vbNullString - это нулевой указатель на строку, а "" - строка нулевой длины. Вот и вся разница
Весь мир матрица, а мы в нем потоки байтов!

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 28.11.2006 (Вт) 18:30

Нус, мистер !Viper!, когда мы передаём функции путь к файлу - функции передаётся указатель? А когда мы пишем пустую строку, разве на неё не передаётся указатель?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 28.11.2006 (Вт) 18:40

Передаётся. Но vbNullString - не указывает ни на какую строку. Соответственно, вместо адреса строки в памяти функция получает нолик.
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.11.2006 (Ср) 0:51

а если я указываю просто 0, чего не так?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.11.2006 (Ср) 0:55

Передаётся строка "0"
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.11.2006 (Ср) 3:00

а чего не выскакивает ошибка, я ведь передаю 0 как число :) (не беру 0 в кавычки)?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 29.11.2006 (Ср) 3:17

Киска, происходит преобразование типов.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 29.11.2006 (Ср) 4:27

2 Киска

Объяви lpszName As Any, все будет и с 0, и с vbNullString.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 29.11.2006 (Ср) 4:33

Все равно что ты поставишь кавычки или CStr
Подпись находится в стадии разработки...

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.11.2006 (Ср) 14:47

А чего оно происходит, преобразование типов? Зачем это нужно? Так бы я видела, что аргумент 0 не подходит, а так получается неправильно!

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 29.11.2006 (Ср) 14:54

API функции не выводят сообщения об ошибках, они возвращают значение по которому можно определить успешно ли было выполнение функции или нет
sndPlaySound запускает WAV-файл или определенный системой звук. При использовании флага SND_NODEFAULT , функция возвращает 0, если WAV-файл (или системный звук) не найден и 1,если звук существует. Если флажок не установлен, функция всегда возвращает 1 и запускает звук по умолчанию Windows, если указанный звук не может быть найден.
Если долго мучиться, что-нибудь получится

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.11.2006 (Ср) 15:29

AntonGV, спасибо, но я говорю о передаваемых аргументах, а не о результате выполнения ф-и :wink:

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.11.2006 (Ср) 16:47

Это сделано исключительно для удобства использования. Однако, такие неявные преобразования могут здорово испортить жизнь.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.11.2006 (Ср) 18:03

Киска писал(а):А чего оно происходит, преобразование типов? Зачем это нужно? Так бы я видела, что аргумент 0 не подходит, а так получается неправильно!

Потому что ByVal.
Если бы было ByRef, то VB выдал бы ошибку о несоответствии типов.
Но в случае с API способ передачи аргумента ты выбрать не можешь, поэтому надо следить самостоятельно.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 29

    TopList  
cron