|
Примечания для кнопок в API-Toolbar:глюки:лечение:проблема:CopyMemory/VarPtr
|
|||
---|---|---|---|
#18+
Вопрос не простой. Думаю если кто может объяснить/помочь и т.п. то м.б. Antonary или скукотища, поэтому в основном на них и рассчитываю Была такая моя тема давно: Как отобразить примечания для кнопок в API-Toolbar Был там такой код: смотреть примерно это место топика Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
с подсказкой Antonary насчет Debug.Print Код работал 3 года в этом виде, но обратил внимание на проблему, если 1) Примечания на русском 2) Наблюдается на некоторых системах Виста (включая чисто русскую) либо Win7 (на английских) 3) Все системы настроены на поддержку "Русский язык для программ не поддерживающих Юникод" -т.е. это условие выполняется Но примечания отображаются как "?????????????". Имея на тек. момент некоторые представления о глючности StrConv(s, vbFromUnicode), описанные например здесь API -ф-ция возвращает указатель на LPWSTR, как переварить в нормальный вид. и какие-то наработки, сделал так (на пальцах-метод проверенный): Код: 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.
Т.е. 1) тупо конвертирую строку в массив байтов ByteStr() As Byte, последний из которых '\0' 2) Подсовываю в uNMTTDI.lpszText указатель на байт (0) этого массива VarPtr(ByteStr(0)) Но: получилось что первые 4 символа строки читаются при выводе примечания как случайная абракодабра , а последующие без ошибок. Т.е. какая-то сволочь стабильно затирает первые 4 байта: 0-1-2-3 Я выкрутился так: Код: 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.
Т.е. 1) Резервирую на 4 байта больше 2) пишу текст начиная с байт №4 3) Подсовываю в uNMTTDI.lpszText сразу указатель на байт (4) этого массива VarPtr(ByteStr(4)) Этот workaround заработал. В том числе на "проблемных" Vista и Win7 ради чего сыр-бор. Но мне все таки непонятно и в этом вопрос: Какая сволочь пишет фигню в первые 4 байта? Уж не CopyMemory ли идущая следом? И как объяснить этой сволочи чтоб не перезаписывала эти 4 байта? Ибо вдруг сволочь захочет еще и следующие 4 байта испохабить... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2013, 02:07 |
|
Примечания для кнопок в API-Toolbar:глюки:лечение:проблема:CopyMemory/VarPtr
|
|||
---|---|---|---|
#18+
Боюсь, я не смогу помочь, в этом вопросе ты разбираешься уже лучше меня :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2013, 10:33 |
|
Примечания для кнопок в API-Toolbar:глюки:лечение:проблема:CopyMemory/VarPtr
|
|||
---|---|---|---|
#18+
Antonariy, в этом вопросе ты разбираешься уже лучше меня :) Да ладно. Там возможно нужно что-то типа AllocateMemory, FreeMemory. Ну это на уровне дилетанства. Т.е. VarPtr(Byte(0)) -первые 4 байта из памяти кто-то успевает затереть и делает это стабильно - причем рэндомной информацией. Т.е. первые 4 символа примечания при тыканье мышкой - каждый раз разная аброкодабра. Или ошибка в где структуре? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2013, 18:07 |
|
Примечания для кнопок в API-Toolbar:глюки:лечение:проблема:CopyMemory/VarPtr
|
|||
---|---|---|---|
#18+
Короче создал тестовый пример для понимания (во вложении) Во избежании таких глюков надо резервировать память и туда писать строку: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
И тогда строка будет храниться по адресу памяти MyPtr сколь угодно долго, и можно ее оттуда читать. Код: vbnet 1.
А когда она уже не нужна, надо память разблокировать, дабы не транжирить: Код: vbnet 1.
Применительно к примечаниям API-тулбар рабочий код будет такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Причем GlobalFree hMem в TTN_GETDISPINFO делать нельзя, это можно (и думаю нужно) сделать в TTN_SHOW (когда примечание уже выводится на экран) либо в TTN_POP (когда примечание убирается с экрана) По какой-то причине незащищенный ptr на НЕродной lpszText не гарантирован от перезаписывания прочими сволочами. Поправьте если неправ. Или может первый вариант со сдвигом на 4 байта использовать? (но первый вариант это шаманство, я не могу объяснить его логически) Мнения есть какие? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2013, 21:50 |
|
Примечания для кнопок в API-Toolbar:глюки:лечение:проблема:CopyMemory/VarPtr
|
|||
---|---|---|---|
#18+
Дмитрий77, Вариант с блокировкой памяти в крайнем посте безусловно правильный. Вышло так, что в одном из своих проектов я про него забыл. Причем сдвиг на 4 байта не помог (иногда глючило на длинных -но меньше 80 (!) Tooltip), понадобился сдвиг на 8 байтов откуда следует что сдвиг методом тыка несерьезно. Но за этим делом обнаружил простое и ясное решение которое не глючит: NMTTDISPINFO structure szText Type: TCHAR Buffer that receives the tooltip text. An application can copy the text to this buffer instead of specifying a string address or string resource. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
А поэтому Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Просто, ясно, без strconv и без издевательств над памятью. И ничего нигде не глючит, ни на русском, ни на английском, ни на XP ни на Вистах. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 09:01 |
|
|
start [/forum/topic.php?fid=60&msg=38277808&tid=2156949]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 146ms |
0 / 0 |