![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте.
Сделал 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
|
||||
|
||||
|
Код:
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: Я в корне делал все не правильно, спасибо огромное. |