|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
Т.е. Код: 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.
По идее я ему должен сделать Код: vbnet 1.
Но если я это сделаю на этапе создания то моя As IPictureDisp будет бесполезна. В коде я делаю: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Варианты ответа: 1) DeleteObject g_picRebarBackground 2) DeleteObject g_picRebarBackground.Handle 3) Set g_picRebarBackground = Nothing 4) ваабще ничего не делать Если бы g_picRebarBackground создавался один раз я бы забил. Но при Form_resize я его перерисовываю (градиент растянут на ширину Rebar, перерисовка вполне себе культурно внешне работает): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Задница в том, что если я чего-то недоглядел и ресурсы эти жрутся, а не авто-удаляются (как хотелось бы), то это задница, поэтому опасения не праздные. Да, и еще. Если сделать 1) DeleteObject g_picRebarBackground 2) DeleteObject g_picRebarBackground.Handle а при этом в коде не выполнялось set = g_picRebarBackground то прога при этом вылетит Error91: Object NOT set Как записать If (g_picRebarBackground) then DeleteObject (будем считать, я не знаю точно был ли он Set -делается в завис. от OS, от выбранного стиля и т.п., юзер мог допустим отключить Темы в процессе работы - я специально данное действо не отслеживаю -пускай перегружает если интерфейс сильно съехал) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 02:16 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
Так застрахован? Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 02:54 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
Дмитрий77, COM-объект, поддерживающий интерфейс IPictureDisp, либо сам управляет временем жизни GDI-объекта (делает DeleteObject (для битмапа)), либо не управляет вовсе. Это определяется третьим параметром OleCreatePictureIndirect(), он же третий параметр CreateIPictureDispFromHBITMAP(). Если параметр не равен FALSE/False (нулю, короче), то такие фокусы как DeleteObject g_picRebarBackground не нужны (и даже вредны), но в данном конкретном случае ни к какому фатальному эффекту не приведут. Ресурсы будут освобождены при уменьшении счётчика использования COM-объекта до нуля. В явном виде уменьшение счётчика это Set g_picRebarBackground = Nothing. В неявном - Set g_picRebarBackground = <другой объект>. Если параметр равен FALSE, то пользователь объекта должен явно управлять временем жизни GDI-объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 10:55 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
Дмитрий77Так застрахован? Код: vbnet 1. 2. 3. 4.
В качестве P.S.: Это должно было бы привести к коду вида Код: vbnet 1. 2. 3.
, но это тавтология, приводящая к просто Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 10:59 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
У меня как-то к утечки приводило GetDC без ReleaseDC :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 13:47 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
БенедиктДмитрий77, COM-объект, поддерживающий интерфейс IPictureDisp, либо сам управляет временем жизни GDI-объекта (делает DeleteObject (для битмапа)), либо не управляет вовсе. Это определяется третьим параметром OleCreatePictureIndirect(), он же третий параметр CreateIPictureDispFromHBITMAP(). Вот это, да? fOwn [in] If TRUE, the picture object is to destroy its picture when the object is destroyed. If FALSE, the caller is responsible for destroying the picture. А ведь я туда глядел, видимо по принципу смотрю в книгу, вижу фигу. А вот ты разжуешь, и сразу вижу буквы, а за ними смысл. БенедиктЕсли параметр не равен FALSE/False (нулю, короче), то такие фокусы как DeleteObject g_picRebarBackground не нужны (и даже вредны), но в данном конкретном случае ни к какому фатальному эффекту не приведут. Ресурсы будут освобождены при уменьшении счётчика использования COM-объекта до нуля. В явном виде уменьшение счётчика это Set g_picRebarBackground = Nothing. В неявном - Set g_picRebarBackground = <другой объект>. И все-таки, четкий ответ? Убрать вообще все эти конструкции? Или все-таки налепить Код: vbnet 1.
Потому как у меня с этими конструкциями при определенных условиях возникает Er.91 (object NOT set), хотя вроде делаю If Not g_picRebarBackground Is Nothing Then Приведу целиком, чего навертел: Код: 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.
А ошибка выдается, если при загрузке формы прога считывает значение стиля "Explorer", что предполагает именно свою отрисовку битмапа поверх банда (как ты учил), а не стиль. Возникает где-то после MsgBox "after DeleteObject", пока не "додебажил". Или я просто что-то навертел не то с передачей "объектов" в функцию? У меня идет создание 3-х панелей подряд, + я использую перерисовку в Form_resize, где этот object переубивается (для "этого стиля"). Не уверен что там ничего не перекрещивается. ДмитУ меня как-то к утечки приводило GetDC без ReleaseDC :) О-о-о! Ето большая бяка. После знакомства с этой бякой я как раз и стал переживать "чтоб все убивать". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 14:28 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
О, нашел ошибку у себя: Код: vbnet 1. 2.
Надо так Код: vbnet 1. 2.
Странно что еще в других ситуациях это работало. Видимо пот. Код: vbnet 1.
НЕ делал Код: vbnet 1.
Ну а hwnd здесь видимо не шибко важен. И все-таки Лепить Set = nothing? Или стереть DeleteObject g_picRebarBackground_txt.Handle повсеместно и успокоиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 14:44 |
|
При создании hBitmap и IPictureDisp из него что я должен удалять при выгрузке формы
|
|||
---|---|---|---|
#18+
Ну, исходя из всего сказанного я остановился на варианте Код: vbnet 1.
Если я правильно понял, то можно не делать ничего и COM-объект вместе с bitmap уничтожится автоматически при выходе из программы (переменная -глобальная). С другой стороны юзер мог запустить программу с темой, кот. использует "кухню", выбрать тему, кот. не использует этой кухни, и в этой теме сидеть еще 24 часа. А на фига эти градиенты будут жрать память все это время. Что касается DeleteObject с учетом объяснений про 3-й параметр OleCreatePictureIndirect(), думаю что чушь полная, тем более COM-объект оно не уничтожает (как писал выше). Ну а насчет 1) If Not ... Is Nothing и 2) Двойной конструкции (т.е. эти две строчки идут подряд) Код: vbnet 1. 2.
-как то душеньке спокойней когда логика прописана, а не подразумевается. Как-то так... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2013, 22:52 |
|
|
start [/forum/topic.php?fid=60&msg=38230415&tid=2157035]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 400ms |
0 / 0 |