|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Thumbnail Toolbars RunTime error 216 WinApi
Здравствуйте.
Сделал Thumbnail Toolbars. Кнопки появились. Но стоит завершить работу приложения, вылезает Runtime error 216 at 00407fd0. Что делать, естественно, не знаю. Код:
unit Unit1; interface uses Windows, Messages, ShlObj, ActiveX; Procedure WinMain; var WndClassEx : TWndClassEx; Form : HWND; MMsg: Msg; tbCreated : Cardinal; pButtons : array[0..3] of TThumbButton; tb : iTaskBarList4; implementation procedure InitTaskBar; var z:integer; begin CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_ALL, iTaskBarList4,tb); for z in [0..3] do begin pButtons[z].iId := z; pButtons[z].iBitmap := z; pButtons[z].dwMask := THB_BITMAP + THB_TOOLTIP; end; pButtons[0].szTip := '1'; pButtons[1].szTip := '2'; pButtons[2].szTip := '3'; pButtons[3].szTip := '4'; // tb.ThumbBarSetImageList(Form, ImgList); tb.ThumbBarAddButtons(Form, length(pButtons), @pButtons); tb.SetProgressValue(Form, 50, 100); end; Function WinProc(Wnd: HWND; Msg : UINT; WParam : WPARAM; LParam: LPARAM): lresult; Stdcall; Begin Result := 0; Case Msg Of WM_CREATE: tbCreated := RegisterWindowMessage('TaskbarButtonCreated'); WM_CLOSE: DestroyWindow(Wnd); WM_DESTROY: PostQuitMessage(0); Else Result := DefWindowProc(Wnd, Msg, WParam, LParam); End; if msg = tbCreated then InitTaskBar; End; Procedure WinMain; Begin FillChar(WndClassEx, SizeOf(TWndClassEx), 0); WndClassEx.cbSize := SizeOf(TWndClassEx); WndClassEx.lpszClassName := 'APIWindow'; WndClassEx.style := CS_HREDRAW Or CS_VREDRAW; WndClassEx.hInstance := HInstance; WndClassEx.lpfnWndProc := @WinProc; WndClassEx.cbClsExtra := 0; WndClassEx.cbWndExtra := 0; WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); WndClassEx.hbrBackground := GetStockObject(LTGRAY_BRUSH); WndClassEx.lpszMenuName := NIL; If RegisterClassEx(WndClassEx) <> 0 Then Begin Form := CreateWindowEx(0, WndClassEx.lpszClassName, '123',WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW, (GetSystemMetrics(SM_CXSCREEN) - 500) div 2, (GetSystemMetrics(SM_CYSCREEN) - 500) div 2, 500, 500, 0, 0, HInstance, NIL); If Form = 0 Then MessageBox (0, 'Окно1 не создалось!', 'Ошибка', MB_OK Or MB_ICONHAND) Else Begin ShowWindow(Form, SW_SHOWNORMAL); While GetMessage(MMsg, 0, 0, 0) Do Begin TranslateMessage(MMsg); DispatchMessage(MMsg); End; Halt(MMsg.WParam); End; End Else MessageBox(0, 'Невозможно зарегистрировать класс окна1', 'Ошибка', MB_OK Or MB_ICONHAND); End; end. Что не так сделал или не доделал? Последний раз редактировалось Stalker2-42, 29.08.2015 в 18:20. |
#2
|
||||
|
||||
Ну подскажите пожалуйста.
Неужели все все равно или так трудно помочь(хотя бы направить)? СПАСИБО!!! |
#3
|
||||
|
||||
Цитата:
Так может произойти, например, при установке некорректного значения какого-либо дескриптора, и последующей попытке освобождения ресурсов, связанных с этим дескриптором. Если выдаётся внешний код ошибки вместо исключительной ситуации, то можно попробовать подключить модуль SysUtils, который попытается преобразовать код ошибки в ИС какого-либо класса. Может быть, ИС будет более информативна. P.S.: есть ведь всезнающий Google. Если он ничего не выдает, значит Вы не так спрашиваете. Код чей, свой или скопированный? Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#4
|
||||
|
||||
Цитата:
Скопирован. И так же читал на сайте микрософта. там не совсем понятно что делать при завершение работы + язык С. Пишу с телефона. Ссылку не могу дать. Комп пришлось разобрать. И ещё, если использовать библиотеку bass.DLL (динамическая загрузка), при её наличие в папке с проектом - все нормально. Если удаль её, при завершение работы - error 216. |
#5
|
||||
|
||||
У автослесарюг есть такое правило: открутил гайку - помни, её потом ещё и закручивать, в смысле что-то создаёте, а убивать забываете
Насчёт динамической загрузки, если ошибка вылетает, значит у вас библиотика всёже статикой подрубается, покажите код пжлст Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
||||
|
||||
реализовал свой вариант, все работает отлично, никаких ошибок в конце не возникает
Пишу программы за еду. __________________ |
#7
|
||||
|
||||
Цитата:
Я не знаю как удалить Не могу показать, по техническим причинам остался без компутера Динамически подрубается. Если DLL нет, проект не стартует, windows ругатсья будет, а тут пашет как милинькая + если библа все же загружена - ошибки при завершение работы НЕТ, а если её удалить из папки с проектом - программа стартует и все работает. Но когда закрываю её --- error 216. Я долго не знал об этом, пока не перевел проект динамическую загрузку BASS. Цитата:
Последний раз редактировалось Stalker2-42, 01.09.2015 в 22:30. |
#8
|
||||
|
||||
Пишу программы за еду. __________________ |
#9
|
||||
|
||||
Цитата:
Спасибо. Последний раз редактировалось Stalker2-42, 01.09.2015 в 22:30. |
#10
|
||||
|
||||
всю информацию по интерфейсам ITaskbarList-ITaskbarList4 взял на MSDN
Пишу программы за еду. __________________ |
#11
|
||||
|
||||
Цитата:
Здравствуйте. В справке я так и не понял как "убивать". Код в архиве вместе с DLL(Динам. загрузка). https://yadi.sk/d/jB76xkAJkQzQ9 Цитата:
На VCL и уменя работает, а на API нет. Последний раз редактировалось Stalker2-42, 12.11.2015 в 20:43. |
#12
|
||||
|
||||
Понятно, за пару месяцев ответ так и не нашёлся, чтож, бывает
С ядиском не дружит мой файрвол, а посему будут лишь догадки Цитата:
Код:
... FreeLibrary(HandleDLL); { For some reason in Win XP you need to call FreeLibrary twice maybe because you get two functions from the DLL } FreeLibrary(HandleDLL); ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Stalker2-42 (14.11.2015)
|
#13
|
||||
|
||||
Цитата:
добавлено позже это сообщение можно удалить Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 13.11.2015 в 11:39. |
#14
|
||||
|
||||
Код проверен на работоспособность в Delphi 2010
Код:
program Project1; uses ActiveX, ShlObj, Windows, Messages; var WndClass: TWndClass; AMsg: TMsg; AWnd: HWND; WMTaskbarButtonCreated: Cardinal; edt: HWND; tbk: ITaskbarList4; procedure InitTaskbarList(hwnd: HWND); var tb: array [0..1] of TThumbButton; begin CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, ITaskbarList4, tbk); tbk.HrInit; tbk.SetProgressState(hwnd, TBPF_INDETERMINATE); tb[0].dwMask:=THB_ICON or THB_TOOLTIP or THB_FLAGS; tb[0].iId:=1; tb[0].iBitmap:=0; tb[0].hIcon:=LoadIcon(0, IDI_INFORMATION); tb[0].szTip:='Info'; tb[0].dwFlags:=THBF_NOBACKGROUND; tb[1].dwMask:=THB_ICON or THB_TOOLTIP or THB_FLAGS; tb[1].iId:=2; tb[1].iBitmap:=0; tb[1].hIcon:=LoadIcon(0, IDI_ERROR); tb[1].szTip:='Close'; tb[1].dwFlags:=THBF_NOBACKGROUND; tbk.ThumbBarAddButtons(hwnd, 2, @tb[0]); end; function WindowProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var buf: array [0..$ff] of Char; begin case uMsg of WM_CREATE: WMTaskbarButtonCreated:=RegisterWindowMessage('TaskbarButtonCreated'); WM_COMMAND: begin if (HIWORD(wParam)=BN_CLICKED) and (LOWORD(wParam)=2015) then begin GetWindowText(edt, @buf[0], $100); MessageBox(hwnd, @buf, WndClass.lpszClassName, MB_OK); end; if (HIWORD(wParam)=THBN_CLICKED) and (LOWORD(wParam)=2) then PostQuitMessage(0); if (HIWORD(wParam)=THBN_CLICKED) and (LOWORD(wParam)=1) then MessageBox(hwnd, 'Hello!', WndClass.lpszClassName, MB_OK); end; WM_CLOSE: PostQuitMessage(0); end; if uMsg=WMTaskbarButtonCreated then InitTaskbarList(hwnd); Result:=DefWindowProc(hwnd, uMsg, wParam, lParam); end; begin OleInitialize(nil); ZeroMemory(@WndClass, SizeOf(TWndClass)); WndClass.style:=CS_VREDRAW or CS_HREDRAW; WndClass.lpfnWndProc:=@WindowProc; WndClass.hInstance:=HInstance; WndClass.hIcon:=LoadIcon(0, IDI_APPLICATION); WndClass.hCursor:=LoadCursor(0, IDC_ARROW); WndClass.hbrBackground:=COLOR_BTNFACE+1; WndClass.lpszClassName:='TMyClassName'; RegisterClass(WndClass); AWnd:=CreateWindow(WndClass.lpszClassName, 'MyClassName', WS_OVERLAPPEDWINDOW or WS_VISIBLE, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 300, 200, 0, 0, HInstance, nil); CreateWindow('STATIC', 'Static:', WS_CHILD or WS_VISIBLE, 10, 10, 100, 25, AWnd, 0, HInstance, nil); edt:=CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', 'Edit', WS_CHILD or WS_VISIBLE or ES_AUTOHSCROLL, 10, 45, 100, 25, AWnd, 0, HInstance, nil); CreateWindow('BUTTON', 'Button', WS_CHILD or WS_VISIBLE, 10, 80, 100, 25, AWnd, 2015, HInstance, nil); while GetMessage(AMsg, 0, 0, 0) do begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; DestroyWindow(AWnd); UnregisterClass(WndClass.lpszClassName, HInstance); tbk:=nil; OleUninitialize; end. Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Stalker2-42 (14.11.2015)
|
#15
|
||||
|
||||
Всем СПАСИБО.
NumLock: Я в корне делал все не правильно, спасибо огромное. |