Не могу разобраться с API

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

Не могу разобраться с API

Сообщение VERITAS » 29.12.2004 (Ср) 12:54

:D Здраствуйте, это опять я.
Уже понятно, что я самый что ни на есть "кастрюля" в API и поэтому прошу помочь разобраться с этими "штуковинами". Читал много учебников по API, но один эффект, там слишком странно написанно - почти ничего не доходит.
Как же все таки объявить конкретный API и уже потом привязать его свойства каким либо объектам.


Например вот простая API проигрывания муз. файлов:
Public Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
К примеру я ее использую как Call mciExecute("play имя.mp3"). Как изменить запись в скобках, чтобы к примеру было типа:
Call mciExecute(play, "имя.mp3")

Или вот например (я уже обращался на форум с таким вопросом но нужного ответа так и не получил.) Есть в Windows WMP9.DLL Подключаю ее к проекту через Components\Windows Media Player. В Object Browser вижу, что у нее есть Property contrast в каком то классе WMPVideoSettingsCtrl, но оно не объявлено. Как же ее объявить и поставить к примеру в зависимости от Value ScrollBar

Всем спасибо!
:) :!:
No comments ...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 29.12.2004 (Ср) 13:09

1) mciExecute

Изменить объявление собственно api-функции нельзя. Можно написать свою функцию для нужного результата, скажем:

Код: Выделить всё
Private Enum PLAY_PARAMS
    play_ = 1
End Enum

Private Function mciExecute2(Mode As PLAY_PARAMS, strFileName As String) As Long
Dim strCmd As String
Select Case Mode
    Case Is = 1:
        strCmd = "play " & """" & Trim$(strFileName) & """"
        mciExecute2 = mciExecute(strCmd)
End Select
End Function


Вызываться, соответственно, будет так:

Код: Выделить всё
Call mciExecute2(play_, "C:\123.mp3")

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 14:03

Amed ты мне написал функцию. Но во первых она не работает, а во вторых я не понимаю что она значит, если бы я понимал, я бы не спрашивал.
Как ее прочитать? Я просто не понимаю. Объясни мне что означают команды в твоей функции.
________________________________
Только без обид, я ведь "кастрюля"
No comments ...

Olga
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 08.09.2004 (Ср) 8:49
Откуда: Москва

Сообщение Olga » 29.12.2004 (Ср) 14:49

VERITAS, всё просто

Amed написал ф-ию с двумя параметрами: 1 - количество параметров (в данном примере 1), 2 - сам параметр

Select Case - оператор выбора, в данном случае он сработает, когда Mode будет равен 1

Дальше формируется строка, типа "play имя.mp3", которая и помещается в вызов ф-ии mciExecute, а результат возвращается в ф-ию mciExecute2

Вот и всё

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 16:10

Спасибо Olga. Теперь стало яснее в разуме.
Я поэкспериментировал с функцией и получил следующее:
объявляю в Модуле:
Код: Выделить всё
Public Declare Function mciExecute Lib "winmm.dll" _
(ByVal lpstrCommand As String) As Long

Public Enum PLAY_PARAMS
    play_ = 1
    stop_ = 2
    pause_ = 3
End Enum

Public Function mciExecute2(Mode As PLAY_PARAMS, strFilePath As String, strFileName As String) As Long
Dim strCmd As String
Select Case Mode
    Case Is = 1:
        If (Trim$(strFileName) = "") Then Exit Function
        If Right$(strFilePath, 1) = "\" Then
        strCmd = "play " & """" & Trim$(strFilePath) & Trim$(strFileName) & """"
        Else
        strCmd = "play " & """" & Trim$(strFilePath) & Trim$("\" & strFileName) & """"
        End If
        mciExecute2 = mciExecute(strCmd)
       
    Case Is = 2:
        If (Trim$(strFileName) = "") Then Exit Function
        If Right$(strFilePath, 1) = "\" Then
        strCmd = "stop " & """" & Trim$(strFilePath) & Trim$(strFileName) & """"
        Else
        strCmd = "stop " & """" & Trim$(strFilePath) & Trim$("\" & strFileName) & """"
        End If
        mciExecute2 = mciExecute(strCmd)
   
    Case Is = 3:
        If (Trim$(strFileName) = "") Then Exit Function
        If Right$(strFilePath, 1) = "\" Then
        strCmd = "pause " & """" & Trim$(strFilePath) & Trim$(strFileName) & """"
        Else
        strCmd = "pause " & """" & Trim$(strFilePath) & Trim$("\" & strFileName) & """"
        End If
        mciExecute2 = mciExecute(strCmd)
End Select
End Function

На кнопке:
Код: Выделить всё
Call mciExecute2(play_, App.Path, "01.mp3")
' или
Call mciExecute2(stop_, App.Path, "01.mp3")
' или
Call mciExecute2(pause_, App.Path, "01.mp3")

И вроде бы все в порядке, делается проверка на знак "\" НО!!!
Он почему то играет только относительные пути? Как его сделать чтоб он как все нормальные модули читал полные пути и длинные??
_________________________________
просветление в мозгах - я вижу свет!
No comments ...

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

Сообщение tyomitch » 29.12.2004 (Ср) 16:50

Может, там апострофы надо вместо кавычек?


В любом случае, вместо "Case Is = 1" и т.п. лучше писать "Case 1", гораздо легче читать.
Изображение

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 17:44

tyomitch а причем тут апострофы??

Я сделал большое количество проверок данной ошибки , и выяснил что она возникает если в названии файла или пути к нему существует пробел " ". В остальных же случаях все читается нормально, хоть путь длинной 120 символов, да и больше.

Теперь кто отклинется, и сможет помочь с этими несчастными пробелами в именах (без них никак!)
________________
дело вошло во вкус
No comments ...

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

Сообщение tyomitch » 29.12.2004 (Ср) 17:57

VERITAS писал(а):tyomitch а причем тут апострофы??

Я говорю, что может быть, вместо кавычек в пути к файлу в строке выполнения надо использовать апострофы? Попробуй!
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.12.2004 (Ср) 18:06

там юзать надо двойные кавычки "" вместо одинарных "

т.е. вызов такой:
Код: Выделить всё

s="play ""c:\My Documents\playme.wav"""


VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 19:03

Я говорю, что может быть, вместо кавычек в пути к файлу в строке выполнения надо использовать апострофы? Попробуй!

tyomitch Я не понимаю куда можно вставить апостроф (как мне известно это знак ' ). Товарищи я же писал, что я не очень то разбираюсь, и пока я понял только разъяснение Ольги (ну и Case 1).

там юзать надо двойные кавычки "" вместо одинарных "

Konst_One Куда писать то надо? Напишите поподробней что на что менять и поясняйте зачем (если не рудно). ПЛИЗ... :roll:
И кто нибудь знает ответ на второй вопрос:
Или вот например (я уже обращался на форум с таким вопросом но нужного ответа так и не получил.) Есть в Windows WMP9.DLL Подключаю ее к проекту через Components\Windows Media Player. В Object Browser вижу, что у нее есть Property contrast в каком то классе WMPVideoSettingsCtrl, но оно не объявлено. Как же ее объявить и поставить к примеру в зависимости от Value ScrollBar

_________________
Можете конечно послать меня в одно место с моими вопросами. Поэтому сразу извиняюсь, что я такой "тупой". :)
No comments ...

Qubicz
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 16.10.2004 (Сб) 20:21
Откуда: Санкт-Петербург

Сообщение Qubicz » 29.12.2004 (Ср) 22:37

Call mciExecute2(play_, App.Path, "01.mp3")

А если вместо App.path поставить путь к папке с mp3-хой?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 29.12.2004 (Ср) 22:40

Qubicz писал(а):Call mciExecute2(play_, App.Path, "01.mp3")

А если вместо App.path поставить путь к папке с mp3-хой?


Qubicz, эта функция так совсем не будет вызываться, у неё только 2 параметра ;)

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 22:58

Так в том та и загвостка, что нужно именно App.path так как эта mp3'шка в дальнейшем будет записана на диск.
А как же она прочитается, если путь изменится, поэтому необходимо app.path. Но может есть другой путь определения местоположения Exe'шника. Киньте свой вариант пожайлуста...

И скажите здесь есть кто нибудь кто мне со вторым вопросом поможет??
No comments ...

Qubicz
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 16.10.2004 (Сб) 20:21
Откуда: Санкт-Петербург

Сообщение Qubicz » 30.12.2004 (Чт) 6:19

Код: Выделить всё
If (Trim$(strFileName) = "") Then Exit Function
Select Case Mode
    Case Is = 1:
        strCmd = "play "
    Case Is = 2:
        strCmd = "stop "
    Case Is = 3:
        strCmd = "pause "
End Select
        If Right$(strFilePath, 1) = "\" Then
        strCmd = strCmd & """" & Trim$(strFilePath) & Trim$(strFileName) & """"
        Else
        strCmd = strCmd & """" & Trim$(strFilePath) & Trim$("\" & strFileName) & """"
        End If
        mciExecute2 = mciExecute(strCmd)

Так короче.

Код: Выделить всё
Public Function mciExecute2(Mode As PLAY_PARAMS, strFilePath As String, strFileName As String) As Long

только я не понял зачем разделять путь к папке и название файла?
И не сделать что-нибудь типа этого
Код: Выделить всё
Public Function mciExecute2(Mode As PLAY_PARAMS, strFilePath As String) As Long

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 30.12.2004 (Чт) 9:02

А кто первый начал разделять? У меня в коде этого нет... Инициатива наказуема ;)

У меня так и было, -
Код: Выделить всё
Private Function mciExecute2(Mode As PLAY_PARAMS, strFileName As String) As Long

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 30.12.2004 (Чт) 10:12

Разделил ПУТЬ и НАЗВАНИЕ Я, ну просто потому что я пытался определить в чем ошибка, почему он не хочет проигрывать файлы в пути или имени которых есть пробел.
Но как бы функция не была записана с разделением на три или два параметра факт остается фактом, ошибка возникает в любом случае.
Да и кстати App.path работает нормально и тоже только в том случае, если нет пробелов.

Ладно уговорили такая функция проще:
Код: Выделить всё
Public Function mciExecute2(Mode As PLAY_PARAMS, strFileName As String) As Long
Dim strCmd As String
    If (Trim$(strFileName) = "") Then Exit Function
Select Case Mode
    Case 1:
        strCmd = "play "
    Case 2:
        strCmd = "stop "
    Case 3:
        strCmd = "pause "
End Select
        strCmd = strCmd & """" & Trim$(strFileName) & """"
        mciExecute2 = mciExecute(strCmd)
End Function
No comments ...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 30.12.2004 (Чт) 19:09

Про пробелы в пути к файлу уже очень-очень много раз говорили. Например, тут:

http://bbs.vbstreets.ru/viewtopic.php?t=6204 ж)

А если серьёзно, то тут:
http://bbs.vbstreets.ru/viewtopic.php?t=9797

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 31.12.2004 (Пт) 0:12

дЫк посмотрел, а там ничего конкретного не написано, только обсуждается указанная мной проблема, а решения так и нет!

И скажите как создать параметр управляющий какой либо функцией DLL
No comments ...

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 31.12.2004 (Пт) 1:22

Да кстати, а можно ли по этому поводу в MSDN обратиться ?? Если да то как и куда писать?
No comments ...

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

Сообщение tyomitch » 31.12.2004 (Пт) 13:46

VERITAS писал(а):Да кстати, а можно ли по этому поводу в MSDN обратиться ?? Если да то как и куда писать?
Цитата дня, адназначна :cool:


2VERITAS: поддержка тут: http://support.microsoft.com/default.as ... D;cntactms
Но она за бабки.
Изображение


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

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

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

    TopList