Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218

Как в редакторе tlb (COM) указать тип параметра "HBITMAP *p"

27.05.2016, 10:00. Показов 2349. Ответов 10

Студворк — интернет-сервис помощи студентам
...если его нет в списке. Как вообще задаются кастомные типы? Вот, например, IThumbnailProvider::GetThumbnail, который я хочу реализовать:

C++
1
2
3
4
5
HRESULT GetThumbnail(
  [in]  UINT          cx,
  [out] HBITMAP       *phbmp,
  [out] WTS_ALPHATYPE *pdwAlpha
);

В редакторе для первого параметра выбрал unsigned int, для второго - даже не знаю. OLE_HANDLE *, что ли?? Третий - вообще труба, его где-то описывать надо, чтобы редактор понял, что это pointer на dword. Да и нет там в списке ничего похожего на DWORD *. И как потом с ними в коде работать? Каждый раз приводить через WTS_ALPHATYPE(pdwAlpha^)?

Но это ещё полбеды. Вот на горизонте следующий, IInitializeWithStream::Initialize, и он вообще ссылается на другой интерфейс... Как его прописать??

C++
1
2
3
4
HRESULT Initialize(
  [in] IStream *pstream, #A pointer to an IStream interface that represents the stream source
  [in] DWORD   grfMode
);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.05.2016, 10:00
Ответы с готовыми решениями:

Как в DataTemplate Указать в виде параметра сам экземпляр или тип как параметр к команде
есть шаблон который я использую для редактирования моего типа: <DataTemplate x:Key="MyTypeItemEditTemplate"...

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых "Библиотека системного программиста" рисование битовых изображений в формате DDB. Загрузил битмап из...

Как правильно указать в Sql запросе логический тип данных и тип "Дата время"?
Как правильно указывать в sql запросе логический тип и тип "дата время"? К примеру, запрос следующего вида: INSERT INTO График VALUES...

10
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
27.05.2016, 11:03  [ТС]
Ценю юмор, но сабж всё-таки по Delphi, верните тему на место
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
03.06.2016, 22:05  [ТС]
TLB_редактор позволил обозначить GetThumbnail только как
Delphi
1
cx: SYSUINT; out phbmb: OLE_HANDLE; out pdwAlpha: OLE_HANDLE
и IInitializeWithStream как
Delphi
1
pszFilePath: PWideChar; grfMode: Integer
ничего лучше в голову не пришло. Вместо реализаций методов написал beep; Скомпоновал dll, зарегистрировал, прописал в реестре как хендлер эскизов - не бипает.. не вызывается совсем. Ожидаемо. Что не так?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
04.06.2016, 01:05
А какая вообще цель конечная? В реестре точно как нужно?
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
04.06.2016, 14:28  [ТС]
Цель - отображать эскизы для собственного типа файлов. В реестре вроде верно, позаимствовал у avi-файлов:

Python
1
2
[HKEY_CLASSES_ROOT\.w12\ShellEx\{e357fccd-a995-4576-b01f-234630154e96}]
@="{МОЙGUID-07F5-42AA-8678-5F1EE0979EF3}"
Была небольшая заминка, какой из четырёх guid подставить, поскольку делфи сделал один для библиотеки, один для CoClass-а, реализующего два указанных интерфейса, и по одному, собственно, для каждого интерфейса. Я перепробовал все, начиная с того, который для CoClass, каждый раз перезапускал проводник.



Добавлено через 7 минут
Вот ссылка на чувака, у которого получилось: http://www.benryves.com/journal/3189294 Но он читер, и делал, похоже, на до диезе.

А там выше я ошибся, это был InitializeWithFile, а для ..WithStream метод выглядит так:
Delphi
1
2
3
4
  IInitializeWithStream = interface(IUnknown)
    ['{A13175A3-ABD9-47DA-9621-4CE40490E411}']
    procedure Method1(const pstream: IUnknown; grfMode: Integer); safecall;
  end;
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
04.06.2016, 16:03
а... Ну допустим. Когда-то читал статьи на такую тему, но за неимением своих форматов до кода не дошло.
Так а зачем вам TLB? В статьях про него не было, делалась обычная DLL.
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
04.06.2016, 18:37  [ТС]
Для меня ole, com и activex - вообще тёмный лес. Я даже не смогу сказать, чем отличаются последние два, знаю только, что одно произошло от другого.

Так а зачем вам TLB?
Попытка создать COM-объект через Файл - Новый приводит появлению упомянутого выше TLB-редактора. Этот редактор генерирует файл "библиотеки типов" с расширением .tlb и .pas-юнит с описанием его содержимого. Можно обойтись без редактора, написать pas вручную, а tlb создать системными средствами, у MS есть консольная утилита для этого. Но обойтись без .tlb-файла нельзя, он помещается в ресурсы dll и считывается в момент вызова TTypedComObjectFactory.Create в первой строчке секции инициализации.

В статьях про него не было,
Вот тут есть http://www.delphikingdom.com/a... logid=1317

Добавлено через 25 минут
Переделал под XE и скомпилировал 64-битную либу, услышал долгожданный БИП. Но не тот, который в обработчике метода интерфейса, а тот, который при инициализации dll. То есть она хотя бы загрузилась - уже хорошо. Метод не вызывается - вот это плохо...

PS Как-нибудь можно заставить работать 32-битную dll? Какие-то флаги там.. модели вызова...? Adobe вообще интерфейс генерации эскизов засунул в EXE-файл.. тоже так хочу)

Добавлено через 1 час 16 минут
Два разных мнения на этот счёт:

A shell extension is just a DLL, and the rule is that 32-bit applications can only load 32-bit DLLs, and 64-bit applications can only load 64-bit DLLs. There is no way around this.
Shell extensions are COM components. If you install it as an out-of-process server, Windows (DCOM) should take care of all the 32 <-> 64-bit marshalling
.
0
04.06.2016, 18:41

Не по теме:

Возможно имеют место быть оба варианта, ибо я когда-то давно видел примеры реализации без всяких TLB. Пока не смог найти, поищу ещё.

0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
05.06.2016, 02:29  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
примеры реализации без всяких
О, а я кажется нашёл Щас буду разбираться...
Кликните здесь для просмотра всего текста
file://C:\Program Files (x86)\Borland\Delphi7\Demos\ActiveX\Shel lExt


Добавлено через 3 часа 16 минут
Нет.. библиотека загружается, но методы не вызываются.

Delphi
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
unit Test;
 
interface
 
uses
  Windows, ActiveX, ComObj, ShlObj, Vcl.Dialogs;
 
type
 
  IThumbnailProvider = interface(IUnknown)
    function GetThumbnail(cx: UINT; out phbmp: HBITMAP; out pdwAlpha: DWORD): HResult; stdcall;
  end;
 
  IInitializeWithFile = interface(IUnknown)
    function Initialize(pszFilePath: PWideChar; grfMode: DWORD): HResult; stdcall;
  end;
 
  IInitializeWithStream = interface(IUnknown)
    function Initialize(const pstream: IUnknown; grfMode: DWORD): HResult; stdcall;
  end;
 
  TMyThumb = class(TComObject, IThumbnailProvider, IInitializeWithStream, IInitializeWithFile)
  private
  protected
    function GetThumbnail(cx: UINT; out phbmp: HBITMAP; out pdwAlpha: DWORD): HResult; stdcall;
    function IInitializeWithFile.Initialize = Initialize_WF; // извращенцы
    function IInitializeWithStream.Initialize = Initialize_WS;
    function Initialize_WF(pszFilePath: PWideChar; grfMode: DWORD): HResult; stdcall;
    function Initialize_WS(const pstream: IUnknown; grfMode: DWORD): HResult; stdcall;
  end;
 
  MyThumb = IThumbnailProvider;
 
const
  MyGUID: TGUID = '{4933E5A1-3367-4C08-8802-677005D745C0}';
 
implementation
 
uses ComServ, SysUtils, ShellApi, Registry;
 
function TMyThumb.GetThumbnail(cx: UINT; out phbmp: HBITMAP; out pdwAlpha: DWORD): HResult;
begin
 beep; ShowMessage('1');
end;
 
function TMyThumb.Initialize_WF(pszFilePath: PWideChar; grfMode: DWORD): HResult;
begin
 beep; ShowMessage('2');
end;
 
function TMyThumb.Initialize_WS(const pstream: IInterface; grfMode: DWORD): HResult;
begin
 beep; ShowMessage('3');
end;
 
initialization
  MessageBeep(MB_ICONERROR);
  ShowMessage('Работает');
  TComObjectFactory.Create(ComServer, TMyThumb, MyGUID, 'MyThumb123', 'MyThumb123', ciMultiInstance, tmApartment);
end.
Добавлено через 2 часа 46 минут
Кажись, заработало.. Минутку......
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
09.06.2016, 17:35  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
Всё-таки получилось? Мои поздравления!
Пасиба) Вот проект, полностью рабочий, скомпилирован под 64 и 32, проверялся только на 64.

Вообще полный песец с этим TChart. Под XE5 голая DLL, делаем TChart.Create - ловится AV: read of address 0x0000000000000010 (да, теперь адреса вот такие прикольные.. ) Сносим XE5, идём к товарищу, у которого другая версия - спокойно компилируется и запускается. Но при попытке зайти в редактор свойств Series - AV рисует уже сама IDE. Но проект компилируется, и это главное. И да, походу, сейчас проект в аттаче - единственный пример IThumbnailProvider на Delphi во всём интернете))
Миниатюры
Как в редакторе tlb (COM) указать тип параметра "HBITMAP *p"  
Вложения
Тип файла: rar test.rar (2.63 Мб, 22 просмотров)
2
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
09.06.2016, 17:48  [ТС]
Регистрируется и разрегистрируется в системе соответственно через

RegSrv32 c:\fakepath\Project1.dll
RegSrv32 c:\fakepath\Project1.dll /u
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2016, 17:48
Помогаю со студенческими работами здесь

Как указать ссылку на указатель в качестве формального параметра
Здравствуйте! Есть функция включения элементов в стек. Как правильно написать прототип функции. т.е. как указать ссылку на указатель в...

Как программно указать для параметра DisplayFormat (ADOQuery)?
Вопрос в заголовке ADOQuery1-&gt;FieldByName(&quot;p&quot;+FloatToStr(pokID))-&gt;DisplayFormat =&quot;0.00&quot; НЕ прокатывает. ...

Как указать больше одного параметра у метода для кнопки?
Дело в том, что если я указываю больше чем один параметр у метода который будет использоваться для UI кнопки, то метод не отображается в...

Как указать каталог в качестве первого параметра командного файла?
Прошу помочь с кодом bat-ка, задание таково: Разработать и выполнить командный файл (КФ), выполняющий проверку наличие файла Numb.txt в...

Как правильно указать тип данных
Вводится массив, нужно удалить все целочисленные элементы и вывести новый массив, не могу разобраться с типами данных. Ошибка нельзя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru