Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.08.2015, 18:06
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
Вопрос 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  
Старый 30.08.2015, 21:23
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Ну подскажите пожалуйста.
Неужели все все равно или так трудно помочь(хотя бы направить)?
СПАСИБО!!!
Ответить с цитированием
  #3  
Старый 31.08.2015, 00:29
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от Stalker2-42
Неужели все все равно или так трудно помочь(хотя бы направить)?
Направляю: Ошибка 216 - нарушение доступа. Ошибка возникает при повреждении данных во время работы с указателями и памятью.
Так может произойти, например, при установке некорректного значения какого-либо дескриптора, и последующей попытке освобождения ресурсов, связанных с этим дескриптором. Если выдаётся внешний код ошибки вместо исключительной ситуации, то можно попробовать подключить модуль SysUtils, который попытается преобразовать код ошибки в ИС какого-либо класса. Может быть, ИС будет более информативна.

P.S.: есть ведь всезнающий Google. Если он ничего не выдает, значит Вы не так спрашиваете. Код чей, свой или скопированный?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #4  
Старый 31.08.2015, 18:01
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Kailon
Код чей, свой или скопированный?
Спасибо что откликнулись.
Скопирован.
И так же читал на сайте микрософта. там не совсем понятно что делать при завершение работы + язык С.
Пишу с телефона. Ссылку не могу дать. Комп пришлось разобрать.
И ещё, если использовать библиотеку bass.DLL (динамическая загрузка), при её наличие в папке с проектом - все нормально. Если удаль её, при завершение работы - error 216.
Ответить с цитированием
  #5  
Старый 01.09.2015, 09:03
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У автослесарюг есть такое правило: открутил гайку - помни, её потом ещё и закручивать, в смысле что-то создаёте, а убивать забываете

Насчёт динамической загрузки, если ошибка вылетает, значит у вас библиотика всёже статикой подрубается, покажите код пжлст
Ответить с цитированием
  #6  
Старый 01.09.2015, 10:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

реализовал свой вариант, все работает отлично, никаких ошибок в конце не возникает
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 01.09.2015, 17:13
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Насчёт динамической загрузки, если ошибка вылетает, значит у вас библиотика всёже статикой подрубается, покажите код пжлст
Всем Здравствуйте!!!
Я не знаю как удалить
Не могу показать, по техническим причинам остался без компутера
Динамически подрубается.
Если DLL нет, проект не стартует, windows ругатсья будет, а тут пашет как милинькая + если библа все же загружена - ошибки при завершение работы НЕТ, а если её удалить из папки с проектом - программа стартует и все работает. Но когда закрываю её --- error 216.
Я долго не знал об этом, пока не перевел проект динамическую загрузку BASS.
Цитата:
Сообщение от NumLock
реализовал свой вариант, все работает отлично, никаких ошибок в конце не возникает
Покажите пожалуйста

Последний раз редактировалось Stalker2-42, 01.09.2015 в 22:30.
Ответить с цитированием
  #8  
Старый 01.09.2015, 17:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

https://yadi.sk/d/dvkP34zriPk8m
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 01.09.2015, 19:47
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Комп сломан, недели через 2, после зарплаты его ремонтом заниматься буду . Можете написать список всех используемых функций, справку почитаю.
Спасибо.

Последний раз редактировалось Stalker2-42, 01.09.2015 в 22:30.
Ответить с цитированием
  #10  
Старый 02.09.2015, 07:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

всю информацию по интерфейсам ITaskbarList-ITaskbarList4 взял на MSDN
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 12.11.2015, 19:40
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
У автослесарюг есть такое правило: открутил гайку - помни, её потом ещё и закручивать, в смысле что-то создаёте, а убивать забываете

Насчёт динамической загрузки, если ошибка вылетает, значит у вас библиотика всёже статикой подрубается, покажите код пжлст


Здравствуйте.

В справке я так и не понял как "убивать".

Код в архиве вместе с DLL(Динам. загрузка). https://yadi.sk/d/jB76xkAJkQzQ9

Цитата:
Сообщение от NumLock

На VCL и уменя работает, а на API нет.

Последний раз редактировалось Stalker2-42, 12.11.2015 в 20:43.
Ответить с цитированием
  #12  
Старый 13.11.2015, 02:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Понятно, за пару месяцев ответ так и не нашёлся, чтож, бывает

С ядиском не дружит мой файрвол, а посему будут лишь догадки
Цитата:
RunTime error 216 at ...
Это происходит, например, во время выхода из программы при автоматическом уничтожении ранее уничтоженных вручную ресурсов. Т.е. программа пытается уничтожить ресурс которого уже нет. Я это встречал при ручном удалении объектов COM или при явном вызове деструктора компонента без предварительного использования метода RemoveComponent так, как его уничтожает Owner автоматом, а тут Qwner натыкается на удаленный мною ресурс. То же происходит с COM если неаккуратно вызывать метод _Release или Free.
Тщательно проанализируйте ваш код, посмотрите где Вы сами уничтожаете объекты. Помните, компоненты, имеющие Owner <> nil удаляются Owner'ом. COM-объекты созданные внутри процедуры удалятся при завершении процедуры и т.д.
Кстати, есть ещё и такой прикол -
Код:
...
 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  
Старый 13.11.2015, 08:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Stalker2-42
На VCL и уменя работает, а на API нет.
так какая разница, VCL туже API использует, соответственно на API тоже работает.

добавлено позже
это сообщение можно удалить
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 13.11.2015 в 11:39.
Ответить с цитированием
  #14  
Старый 13.11.2015, 11:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию Код проверен на работоспособность в 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  
Старый 14.11.2015, 14:48
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Всем СПАСИБО.
NumLock:
Я в корне делал все не правильно, спасибо огромное.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter