|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
В моем примере из этой темы: 13101649 возвращаются имена аудиоустройств ограниченные MAXPNAMELEN = 32 (31 символ + '\n'): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
======== В моем другом примере: 13109883 возвращаются имена этих же устройств, но не ограниченные 31-им символом. Но при этом они возвращаются как A pointer to a null-terminated Unicode string in the user default locale : Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
======== Моя задача: (1)Сравнить второе с первым (например по первым 31 символам) и если соответствие найдено, то (2)вывести второе на обозрение юзера вместо первого (ибо так юзеру приятнее). С технической точки зрения (выбор устройства) первого достаточно. Я столкнулся с Юникодь-проблемой, кот. меня раньше особо не волновали. То бишь мне надо привести второе к виду первого (надо думать в соответствии c user default locale ). Сначала я тестировал на Win 7 English, меня это порадовало. Но потом я рискнул на Vista Russian, и меня знаки вопросиков(только вместо русских букв) огорчили. Текущий код преобразования Ptr -> ToString такой: Код: 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.
Т.е. чего сделать надо, чтоб допилить? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 11:06 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Советую задавать такие вопросы здесь . Их там любят и быстро отвечают. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 11:44 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Antonariy, я туда не хожу. ну а сам ответить не можешь? этот вопрос думаю стандартный, или все-таки сложный? Просто голова уже не варит после этих ICollections::Inumerators. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 11:59 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Дмитрий77, по коду PointerToString замечаний, помимо авторских, особо нет. Дело в чём-то другом. Например, в используемой кодировке, OEM-ной (DOS-овской), как вариант; или каким-то боком полученной ANSI-шной строки вместо Unicode-вской. Это надо на коды этих знаков вопроса посмотреть. По поводу головной боли от ICollections::Enumerators и подобногоИМХО, головной боли будет гораздо меньше, и код будет гораздо более удобоваримым, схожим с сиплюсплюсным или дельфовским (причём где-то более простым), белым и пушистым, если освоить простой, в принципе, язычок ODL, и уметь создавать свои библиотеки типов (если нет готовых, как эта , лучшая в своём роде, но, как не обновляемая автором, уже не поспевающая за современными требованиями) по описаниям интерфейсов в MSDN Library. Та техника, что используется в "французском классе", с ручным созданием таблиц виртуальных методов и вызовами методов по указателю, имеет какой-то смысл в VBA или в случае общей code base для проектов на VB и VBA, и то в основном потому, что для VBA-проектов лишняя ссылка в References - лишняя головная боль при деплое и обновлении. P. S. Не воспримите за демагогию, проверено на собственной шкуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 12:28 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Бенедикт Например, в используемой кодировке, OEM-ной (DOS-овской), как вариант; или каким-то боком полученной ANSI-шной строки вместо Unicode-вской. Это надо на коды этих знаков вопроса посмотреть. Дык сказано же: 'A pointer to a null-terminated Unicode string in the user default locale . Собственные инструкции из этого поста 12684884 вроде как выполнены. Просто не умеет видимо VB6 Unicode-строку изображать. И дело ж не только в "отображать", а ее еще надо сравнить с первым вариантом который явно не Юникодовский (там кстати все по русски), т.е. надо преобразовать этот чертов юникод к обычной строке и с ней работать. Или чего-то не догоняю? А по поводу "французском класса", я ж его переделал под "немецкий". Думаю такие задачи решать нечасто надо, а опыта как бы прибавилось. Но к слову скажем, на C++ у меня этот код (простой и пушистый) скомпилировать не удалось ну никак. Ломать систему скачивая всякие SDK рука не поднялась, итак эти 2010 экспрессы скрипя понаставил. Компилируешь тот же проект на C++2010 вместо 2005, он не запускается на другом компе, требует каких-то Re-distrabutable. VB.NET с трудом чего-то сделал, лавируя между тем что написал компилятор (а будто мне это надо читать) и выписывая километры всяких System.Marshal, дык он потом .NET 4.X требует. В VB6 как то с этим проще. В Opal из VB6 влез, и мне этого счас с головой хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 13:16 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Дмитрий77Antonariy, я туда не хожу.Зря. Сэкономил бы кучу времени. Дмитрий77ну а сам ответить не можешь? Если б знал, ответил бы или ссылку дал. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 13:27 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Дмитрий77, Вот это Код: vbnet 1.
всё-таки не нравится. Попробуйте Код: vbnet 1.
"на фсякей". VB-шные строки в C++ имеют название BSTR, это юникодовские (в понятии MS) строки. А вот с отображением в VB-шных элементах управления могут быть проблемы. Поэтому и говорю - надо бы числовые коды увидеть, они не врут :) . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 13:42 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
БенедиктДмитрий77, Вот это Код: vbnet 1.
всё-таки не нравится. Попробуйте Код: vbnet 1.
"на фсякей". Если сделать как вы говорите: Код: vbnet 1.
то ВЕСЬ текст (включая русский) будет отображаться корректно. Но: меня смущает то, что если сделать дополнительно так: Код: vbnet 1. 2. 3. 4. 5. 6.
то 1) не находит Chr(0) 2) при этом показывает в MsgBox длину в 2 раза большую. Отсюда вывод: тамо в этой PointerToString As String чуда-юдо мутное сидит . И непонятно как оно себя будет вести при операциях сравнения букав с другой сторокой (кот. получена первым способом). Предполагается подбор соответствий по принципу Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Да и будет ли оно ВСЕГДА корректно отображаться у товарищей на местах (в Китаях, Япониях и Франциях). Мне то по сути надо получить "обычную" As String в текущей кодировке системы, а у меня там VB-мутант сейчас сидит согласно страшным сказкам с упомянутой VBstreet. На vbstreet советуется SysAllocString, так понял для конвертации (Unicode)Ptr -> (Обычный)Ptr, но чет у меня пока ничего не выходит. StrConv(str, 128) еще пробовал -творят что хотят. То русские буквы OK, а EN- знаки вопроса, то строки обрезаются странным образом. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 20:24 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 23:59 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
скукотища, чет мне этот StrConv не нравится совсем. Я короче сделал так: Код: 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.
И вот теперь я уверен что всегда найду соответствия между Вариант1 и Вариант2. Wave функции отдают ANSI, а никак не юникод. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 00:39 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
> Дмитрий77, > чет мне этот StrConv не нравится совсем. > Я короче сделал так: Не нравится, так не нравится, - насильно мил не будешь. Работает, - ну и ладно. > Wave функции отдают ANSI, а никак не юникод. Честно говоря, не понял, к чему Вы это.. Ведь проблема, насколько понял, была именно в получении ANSI-string изA pointer to a null-terminated Unicode string in the user default locale.при наличии в возвращаемой строке национальных символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 01:11 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
скукотища, Replace(strTemp, Chr(0), "") -это конечно чушь полная. Но дело в том, что если оставить как вы написали, то строки которые as String будут удвоенной длины len(str). Т.е. не уверен что с ними можно нормально работать, а если сделать: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
то будет выдавать полную чушь. Причем 3-й параметр -LocaleID согласно документации =default, он не срабатывает что-ли, даже если написать 1049 для проверки, то ничего не меняется. В моем примере с API по крайней мере ясно что 1) есть указатель lngPtr на LPWSTR 2) есть дефолная кодовая таблица CP_ACP по которой переводим в ANSI 3) есть длина строки lstrlenW в буквах 4) на выходе имеем НЕ-юникод массив нормальных байтов bytBuffer() 5) с этими байтами тупо и по одному разбираемся понятным способом И самое главное результат соответствует обоснованным ожиданиям и полученный объект обладает привычными для таковых свойствами (например len() соответствует к-ву буков). А чего там StrConv делает и че VB понимает под As string в первом варианте и можно ли на это полагаться это сам черт не разберет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 01:41 |
|
API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид.
|
|||
---|---|---|---|
#18+
Дмитрий77, не готов сейчас дискутировать "по-полной". Есть замечание: LCID из StrConv это далеко не то же самое, что CodePage из WideCharToMultiByte. ЗЫ: ... действительно, если StrConv вызывать внутри PointerToString то чушь получается полная. *недоумение Если скармливать ей результат PointerToString - то результат приемлимый, как по длине строки, так и по содержанию. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 03:04 |
|
|
start [/forum/topic.php?fid=60&msg=37943685&tid=2157464]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 145ms |
0 / 0 |