|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
Здравствуйте. Не получается в hook-процедуре для GetOpenFileName считать структуру OPENFILENAME. Пытаюсь делать все по феншую. То бишь, в соответствии с официальной документацией. Но Word схлопывается на CopyMemory (пометил в коде): Код: 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. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
Пробовал и такой вариант: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Подскажите, где дурак? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 04:31 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
Сын вождя Код: vbnet 1. 2. 3. 4. 5.
Подскажите, где дурак? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 11:12 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
234522Сын вождя Код: vbnet 1. 2. 3. 4. 5.
Подскажите, где дурак? Но этот вариант тоже не работает (см. пример выше): Код: vbnet 1. 2. 3. 4. 5.
Пока, выкинул CopyMemory и читаю данные напрямую из формы, через SendMessage. Но хотелось бы понять, где ошибка с OPENFILENAME? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 11:44 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
Сын вождя, нет VBA7, поэтому без LongPtr. И без String, до кучи (может, паранойя): Код: 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. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102.
Не падает, в Locals значения правдоподобные. Может, не мучиться, и взять готовое 20756996 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 12:19 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
234522нет VBA7, поэтому без LongPtr. И без String, до кучи (может, паранойя) Без String неудобно, когда надо получать, а не только отправлять. Как раз мой случай. Переход на GetOpenFileNameW (вместо GetOpenFileNameA) поддерживаю, хотя он и влечет применение StrConv. 234522Не падает, в Locals значения правдоподобные. Да, разобрался! Благодарю! Понял ошибку с размером. 234522Может, не мучиться, и взять готовое 20756996 ? Так нигде нет примера, в том числе по ссылке, где читается что-то из OPENFILENAME. К сожалению, при отладке функций API, Word часто схлопывается на точках останова, хотя код рабочий. Все-таки склоняюсь к GetDlgItem и SendMessage, вместо CopyMemory ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 15:50 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
Сын вождяБез String неудобно, когда надо получать, а не только отправлять. Как раз мой случай.Со String "за сценой" происходят строковые преобразования, в некоторых случаях совсем лишние. Как по мне, в таких случаях можно написать класс-оболочку для структуры, и пользоваться явным преобразованием: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Сын вождяПереход на GetOpenFileNameW (вместо GetOpenFileNameA) поддерживаю,Windows 95 уже кончилась, да. Хотя и там был Unicode layer.Сын вождяхотя он и влечет применение StrConv.Где, зачем (с учётом вышеприведённой процедуры)?Сын вождя234522Не падает, в Locals значения правдоподобные. Да, разобрался! Благодарю! Понял ошибку с размером.Код Код: vbnet 1. 2. 3.
как раз-таки быстрый-грязный и совсем не образец для подражания, поскольку теоретически потенциально приводит к buffer overrun. После чтения размера структуры надо выделять либо буфер нужного размера и копировать туда, либо, если мы решили обойтись Dim oOFN As OPENFILENAME, писать в oOFN Минимум(LenB(oOFN), oOFN.lStructSize) байт.Сын вождя234522Может, не мучиться, и взять готовое 20756996 ? Так нигде нет примера, в том числе по ссылке, где читается что-то из OPENFILENAME.По ссылке есть, в том числе пример (Example_GetFileName). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 19:46 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
234522Со String "за сценой" происходят строковые преобразования, в некоторых случаях совсем лишние. Как по мне, в таких случаях можно написать класс-оболочку для структуры, и пользоваться явным преобразованием Если еще и за сценой конвертер стоит, то конечно. Сейчас, для string, везде приходится делать StrConv, как на выходе, так и на входе. 234522 Код: vbnet 1. 2. 3.
как раз-таки быстрый-грязный и совсем не образец для подражания, поскольку теоретически потенциально приводит к buffer overrun. После чтения размера структуры надо выделять либо буфер нужного размера и копировать туда, либо, если мы решили обойтись Dim oOFN As OPENFILENAME, писать в oOFN Минимум(LenB(oOFN), oOFN.lStructSize) байт. Хм. Значит, между двумя CopyMemory не хватает строки, подгоняющей размер oOFN. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2017, 20:43 |
|
API: Как в hook-процедуре для GetOpenFileName получить OPENFILENAME?
|
|||
---|---|---|---|
#18+
Сын вождя234522как раз-таки быстрый-грязный и совсем не образец для подражания, поскольку теоретически потенциально приводит к buffer overrun. После чтения размера структуры надо выделять либо буфер нужного размера и копировать туда, либо, если мы решили обойтись Dim oOFN As OPENFILENAME, писать в oOFN Минимум(LenB(oOFN), oOFN.lStructSize) байт. Хм. Значит, между двумя CopyMemory не хватает строки, подгоняющей размер oOFN. Выше написано что-то не то. Ведь размер структуры не меняется, откуда переполнение? Правильнее будет прервать обработку, если LenB(oOFN) отличается от размера oOFN.lStructSize, считанного здесь CopyMemory oOFN.lStructSize, ByVal oNotify.lpOFN, LenB(oOFN.lStructSize). То есть, когда функция вернула непонятно что. В свете этого, кстати, даже при совпадении размеров не факт что структуры объектов совпадают. Это выходит вообще беда :( Тему ветки можно свести в вопросу: "Как по указателю на объект, получить объект". Есть какая-то универсальная схема? Как-то можно определить, что структура объекта по указателю, совпадает с объявленной нами? Если в документации по API одно, а функции API возвращают другое, то как работать? Или это я не дочитал? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2017, 05:58 |
|
|
start [/forum/topic.php?fid=61&msg=39554967&tid=2172488]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 429ms |
0 / 0 |