|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Исходный код C++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
был мной переписан на VB6 как Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Я проверял в VB-среде все работает как надо. Запускаю скомпилированный exe -выдает чушь (неправильное имя звукового устройства). Начал копать. Тонкое место оказалось: Код: vbnet 1.
Т.е. проверка во второй части : str = device Должна использовать str, вычесленное в первой части: GetWaveOutDeviceName(id, str) где все аргументы ByRef так понимаю Код: vbnet 1.
Так вот: в случае VB-среды используется str, вычисленное в первой части В случае exe используется str, которое было ранее (до выполнения первой части). Я конечно перекатал код в виде: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
и стало как надо, но чет меня не очень порадовало такое положение дел. Просто еще пришлось сломать мозг чтоб этот кусок найти. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 21:44 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Дмитрий77где все аргументы ByRef так понимаю Не правильно. Все параметры API должны вызываться как ByVal (ну кроме структур, и явной передачи указателя через As Any/саму переменную) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 22:06 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Кстати, GetWaveOutDeviceName в какой библиотеке определяется? она не стандартная? Что-то не гуглится. И приведите её декларацию ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 22:09 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
VSVLADКстати, GetWaveOutDeviceName в какой библиотеке определяется? она не стандартная? Что-то не гуглится. И приведите её декларацию В моем модуле она определяется. id -на входе; name-на выходе ID в принципе можно было бы ByVal, но name точно ByRef Все эти ф-ции построены по одному принципу (типа той что привел). Если false , то "не удалось" Если true, то берем значение (параметр в аргументах). Что касается API, то либо 0=MMSYSERR_NOERROR -> ведет к true либо <>0 -номер ошибки -> ведет к false Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Исходник на C++: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Но ваши возражения не по теме вопроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2012, 23:12 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Как ниже по крайней мере не воспроизводится. (всегда "yes") Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Короче полечил и ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 01:06 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Дмитрий77, Вопрос был, что в среде и в скомпилированном варианте по разному выполняется код. Делаю аналогию (частично код не был предоставлен, некоторые объявления, параметры вызова - пришлось придумать самому) Код: vbnet 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.
При выполнении в скомпилированному варианте и в среде - я вижу сообщение. Т.е. условие проходит успешно, т.е. Имя устройства совпадает. Так что мои возражения были по теме (Так как не было известно что это API или самописаная функция). Лучше приложите полные объявления и констант и структур, а лучше минимальный код, чтобы можно было проблему смоделировать ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 09:20 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
VSVLADЛучше приложите полные объявления и констант и структур, а лучше минимальный код, чтобы можно было проблему смоделировать Ловите тестовый проект. В соседней теме: 13101249 Кстати м.б. тогда прокомментируете заданные там вопросы? Я вижу Вы разбираетесь. Идеи всех функций в основном брались отсюда: http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?revision=28275&content-type=text%2Fplain причем часть изменений (в части mute контролов и нахождения микрофона -актуально для XP) была сделана мной (см.хронологию:) http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?view=log Логика функций о которых говорим (получение имен девайсов, ID и т.п.) перекатано оттуда. Да, еще. Мне очень не нравится, ваш же код это показывает: Код: vbnet 1. 2. 3. 4. 5. 6.
Хотя это и не мешает выбирать подобный девайс на Win7 (благодаря тому что согласно структуре кода этот глюк "обратимый"). Сейчас работаю в этом направлении. Хотя направление решения уже найдено: Идея: waveOutGetDevCaps, Win7 and long device names Кажется реализация: http://files.codes-sources.com/fichier_fullscreen.aspx?id=47768&f=class%2FclsAfMasterVolume.cls]class/clsAfMasterVolume.cls du code source VOLUME MASTER : ETAT VOLUME WINDOWS - MODIFIER LE VOLUME, LE MUTE, ET OBTENIR DES INFORMATIONS SUR LA CARTE SON [MODULE DE CLASSE] Если удастся допилить, возможно выложу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 14:59 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Дмитрий77, Посмотрел проект, работает регулировка звука в ехе и в среде, имена устройств выводит теже, не меньше не больше. Только для регулировки звука создаётся "свой миксер", не регулируется системный. Ещё есть интересная статья , может поможет что решить. Про длину буфера для имени устройства ещё не смотрел, если будет время погляжу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 16:24 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
VSVLAD, VSVLADТолько для регулировки звука создаётся "свой миксер", не регулируется системный. То что оно регулирует меня вполне устраивает. В XP это будет (для Player) устройство "Wave" (Общая громкость -> звук) , в 7-ке видимо то что вы называете "свой миксер". Я сначала хотел сделать "Volume Control" (Общая громкость -> общая), но получил возражения от разработчика Opal: http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?view=log Reversed out the previous sound volume changes for Windows MultiMedia API. They are too specific and do not support all devices, e.g. USB headset. Code was returned to the original, which set the master volume control. Так что здесь все в порядке. VSVLADПосмотрел проект, работает регулировка звука в ехе и в среде, имена устройств выводит теже, не меньше не больше. В проекте модифицированный вариант кода. См. Private Function GetDeviceID Вы заменяли на мой первый вариант?: Код: vbnet 1.
У вас одно звуковое устройство? У меня на тестовом компьютере несколько, включая всякие хз с чем есть "Модем #6 Линейный вход". Смотрите картинку ниже. Я утверждаю, что при первом варианте кода при выборе в листбоксах "Realtek HD.. " и нажатии <Start>, будут выбраны (вернее не выбраны так как их нет) контролы для "Модем #6... ", то бишь str=device в exe-шнике выполнится только на следующем шаге цикла, а не на текущем. А в VB среде выберется "Realtek HD.. ", как задумано. VSVLADПро длину буфера для имени устройства ещё не смотрел, если будет время погляжу. Через waveOutGetDevCaps вы ничего не добьетесь. Надо думать в том направлении что я указал (французский пример). Я его сейчас аккуратно переписываю, даже не прочь выложить то что есть на сейчас (функция PrintEndpointNames). Но, я дошел до места где автор честно споткнулся: Код: vbnet 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.
Смотрим PROPVARIANT structure У автора написано: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
По успешному опыту борьбы с Unin-ами в Opal я попробовал так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Но что-то у меня на 7-ке все одно все крашит, чеб я не делал. (на XP этот код запускать бессмысленно) Код: vbnet 1.
-вот здесь Взгляните, м.б. найдем идею? А то обидно - на последней структуре споткнуться когда уже все раскурочено и казалось бы иголка в яйце - вот она -ан нет, тамо бомба и она взрывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 17:34 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Вот кстати оригинальный французский пример (на всякий случай): ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 17:36 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
А как на VB6 перевести: Код: plaintext 1.
Сдается мне, что Код: vbnet 1.
это чистой воды отсебятина автора, а потому и крашит. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 06:12 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
Дмитрий77А как на VB6 перевести: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Сдается мне, что Код: vbnet 1.
это чистой воды отсебятина автора, а потому и крашит. msdn DEFINE_PROPERTYKEY mscro ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 10:24 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
скукотища, за подсказку спасибо, уже где-то близко мыслил. Пока не пробовал, но смотрите: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Имеем: Код: plaintext 1.
Наверно так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Дальше мне надо сделать IPropertyStore::GetValue method (ниже нерабочий авторский код, где он тупо сует PKEY_Device_FriendlyName As Long = &H1 'constante personelle в чем видимо неправ): Код: vbnet 1. 2. 3. 4. 5.
Т.е. теперь мою структуру PKEY_Device_FriendlyName 3-им параметром туда засунуть? А как? PKEY_Device_FriendlyName 'my или varptr(PKEY_Device_FriendlyName) Я хоть на верном пути? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2012, 18:02 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
> Дмитрий77 > Т.е. теперь мою структуру PKEY_Device_FriendlyName 3-им параметром туда засунуть? > А как? > PKEY_Device_FriendlyName 'my > или > varptr(PKEY_Device_FriendlyName) Однаковенно, т.к. пользовательские типы в VB всегда передаются по ссылке. * * * * * * * * * ЗЫ: > Я хоть на верном пути? Насчёт Дао, здесь 13101649 Вы объявляете пользовательский тип PROPVARIANT. Может для IPropertyStore::GetValue в качестве выходного параметра подойдёт нативный VB-шный Variant ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 23:02 |
|
А что, в VB среде и в "EXE" логика разная?
|
|||
---|---|---|---|
#18+
скукотища, Так все уже доделал, взгляните на рабочий код: Получение длинных имен аудиоустройств на Vista/Win7 скукотища> varptr(PKEY_Device_FriendlyName) Однаковенно, т.к. пользовательские типы в VB всегда передаются по ссылке. Именно так и надо. скукотищаВы объявляете пользовательский тип PROPVARIANT. Может для IPropertyStore::GetValue в качестве выходного параметра подойдёт нативный VB-шный Variant ? C Юнионами я собаку съел когда с Opal API разбирался. Да пользовательский. И надо так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
И если бы мне надо было получать PROPVARIANT разных типов (а здесь я знаю чего придет), то в данном случае я бы тупо возвратил ptr as long, скопировал бы 2 байта в Integer (vt), а в завис. от этого выбрал бы PROPVARIANT_typeN (можно даже сразу выкинуть первый параметр vt) и скопировал бы оставшиеся len(PROPVARIANT_typeN ) байтов в PROPVARIANT_typeN. Здесь просто ясно что vt=31(VT_LPWSTR). Я думаю, что французский вариант допиливается точно также: У автора несколько ошибок: 1) Не разобрался с PROPERTYKEY PKEY_Device_FriendlyName На самом деле достаточно знать PID=14, а GUID можно получить перебором через IPropertyStoreInterface::GetAt (i, &PROPERTYKEY) 2) Он неправильно записал PROPVARIANT 3) Он перепутал последовательность IPropertyStoreInterface::function что существенно Методом тыка я установил что ::GetCount=3; GetAt=4; GetValue=5; SetValue=6 Автор пытается выполнить [6], я в конце концов увидел эту -2147024891 (Нет разрешения на выполнение ф-ции), а при STGM_READ из всех их только >>>Set<<<Value не может быть выполнена. Но вообще конечно прикольно, первый раз с подобными кодами сталкиваюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 00:27 |
|
|
start [/forum/topic.php?fid=60&msg=37940137&tid=2157465]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 166ms |
0 / 0 |