Простейший примерчик вырезания рисунка из StdPicture

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 17:58

Какая именно строчка вселяет тебе уверенность в правильности интерфейса?
а) «Я заключаю, что интерфейс объявлен верно, исходя из того, что строчка Set p = LoadPicture("test.bmp") успешно выполняется.»
б) «Я заключаю, что интерфейс объявлен верно, исходя из того, что строчка Set Me.Picture = p успешно выполняется.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 18:18

LoadPicture возвращает объект класса StdPicture Так?
Раз срабатывает Set p = объект_классa_StdPicture, значит в классе StdPicture реализован тот интерфейс, которым объявлен p. Так? Или нет? Я думал, что если хоть один метод в IPicture был бы некорректно объявлен, присвоение бы не последовало.

Set Me.Picture = p - просто чтобы убедиться, что картинка действительно загрузилась. Всякие p.widht тоже возвращаются :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 18:42

arthur2 писал(а):значит в классе StdPicture реализован тот интерфейс, которым объявлен p.

Так.

arthur2 писал(а):Я думал, что если хоть один метод в IPicture был бы некорректно объявлен, присвоение бы не последовало.

Но соответствие делается по IID-у, а не по объявлению.

При присвоении Set p = <std_picture> вызывается метод StdPicture::QueryInterface, и ему передаётся IID-интерфейса MyTlb.IPicture.

Ты мог TLB объявить свой IPicture невероятно криво, а вместо реального IID-а интерфейса IPicture указать IID интерфейса IVodka. И если бы вдруг IVodka поддерживался классом StdPicture (наряду с другими), то и в этом случае присвоение бы сработало. Хотя объявление интерфейса насквозь неправильное, а IID не соответствует реальному.

Иными словами, из факта успешного присвоения можно заключить смело только одно: метод QueryInterface не отверг переданный ему IID. Тот ли IID указан, который подразумевался и правильно ли объявлено всё остальное в интерфейса — сказать из по успешности присвоения нельзя.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 19:13

Угу, дошло :oops:
Переобъявил p аки обжект - с тем же эффектом.

Теперь - непонятно, почему тогда не работает присвоение моему классу (пусть в нем реализован неправильный интерфейс, но ведь иид-то правильное).

Ладно, пусть дело в тлб. Как проверить? и как сделать правильно? Можно ли обозвать интерфейс по-своему? дабы не путать с оригинальным (IMyPicture)?

Я просто декомпилировал stdole2.tlb, взял там готовые объявления и заменил лонгами указатели на войды.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 19:31

Теперь - непонятно, почему тогда не работает присвоение моему классу (пусть в нем реализован неправильный интерфейс, но ведь иид-то правильное).

Не понял, код в студию, что за «присвоение своему классу».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 19:53

Код: Выделить всё
Dim c As cMyPic
Set c = Me.Picture
Почему ошибка именно несовпадения типа, раз проверяется только иид? Понятно, что тут - класс, а там - голый интерфейс, но почему - именно несовпадение типа, если иид подходящий?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 19:55

Если в данном случае cMyPic — какой-то класс (какой бы он не был и какие бы интерфейсы не поддерживал), работать вообще ничего не должно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 19:59

брр, наоборот:set picture=new cmypic

Хотя это - уже детали. Косяк, как я понял, все же в тлб :oops:

Как сделать правильно? И как проверить, что всё правильно?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 20:06

arthur2 писал(а):брр, наоборот: set picture=new cmypic


В данном случае, что такое picture?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 20:16

Код: Выделить всё
me.picture
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 20:23

Ещё раз повторяю о наличии Set-хендлера.

Представь, что у тебя не Set Me.Picture = New CMyPic, а SetMePicture(New CMyPic).

И внутри этой функции есть всякие обращения к методам IPicture. И отклики на эти обращения выглядят неадекватными. Видя неадекватность, функция выкидывает ошибку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 20:30

Ну, вроде, понятно... И всё-таки, сначала тлб:
Как сделать правильно? И как проверить, что всё правильно?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 20:34

Что значит «правильно»?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 21:02

Так декомпилируется IPicture
Код: Выделить всё
[
  odl,
  uuid(7BF80980-BF32-101A-8BBB-00AA00300CAB),
  helpstring("Picture Object"),
  hidden
]
interface IPicture : IUnknown {
    [propget]
    HRESULT _stdcall Handle([out, retval] OLE_HANDLE* phandle);
    [propget]
    HRESULT _stdcall hPal([out, retval] OLE_HANDLE* phpal);
    [propget]
    HRESULT _stdcall Type([out, retval] short* ptype);
    [propget]
    HRESULT _stdcall Width([out, retval] OLE_XSIZE_HIMETRIC* pwidth);
    [propget]
    HRESULT _stdcall Height([out, retval] OLE_YSIZE_HIMETRIC* pheight);
    HRESULT _stdcall Render(
                    [in] int hdc,
                    [in] long x,
                    [in] long y,
                    [in] long cx,
                    [in] long cy,
                    [in] OLE_XPOS_HIMETRIC xSrc,
                    [in] OLE_YPOS_HIMETRIC ySrc,
                    [in] OLE_XSIZE_HIMETRIC cxSrc,
                    [in] OLE_YSIZE_HIMETRIC cySrc,
                    [in] void* prcWBounds);
    [propput]
    HRESULT _stdcall hPal([in] OLE_HANDLE phpal);
    [propget]
    HRESULT _stdcall CurDC([out, retval] int* phdcOut);
    HRESULT _stdcall SelectPicture(
                    [in] int hdcIn,
                    [out] int* phdcOut,
                    [out] OLE_HANDLE* phbmpOut);
    [propget]
    HRESULT _stdcall KeepOriginalFormat([out, retval] VARIANT_BOOL* pfkeep);
    [propput]
    HRESULT _stdcall KeepOriginalFormat([in] VARIANT_BOOL pfkeep);
    HRESULT _stdcall PictureChanged();
    HRESULT _stdcall SaveAsFile(
                    [in] void* pstm,
                    [in] VARIANT_BOOL fSaveMemCopy,
                    [out] long* pcbSize);
    [propget]
    HRESULT _stdcall Attributes([out, retval] long* pdwAttr);
    HRESULT _stdcall SetHdc([in] OLE_HANDLE hdc);
};


Что надо изменить? Как потом проверить, что ничего не испортил?
Я изменил все войд-указатели на лонги, все OLE_ на лонги, VARIANT_BOOL на шорт.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 21:21

Что надо изменить?

Это какой-то неправильный порочной подход. У меня все события, понятия, мысли, принципы и тому подобное обраует в голове стройное дерево отношений. Нет ничего, что висело бы просто так.

На форуме я часто вижу фразу «надо» и т.п., но никак не могу понять, «надо в рамках достижения какой цели»?

В данном случае, как я сказал, ошибку выбрасывает реализация Set-хендлера. Надо быть даже очень мало соображающим, чтобы понимать, что реализация Set-хендлера не может анализировать твою TLB на предмет правильности. Отсюда делаем вывод, что источником проблем может быть (остаётся только это) реализация методов.

Причём не нужно делать лишних выводов. Это не значит, что в TLB нет ошибок. Может быть они есть и влияют на правильность реализации, и, таким образом, косвенно являются причиной проблемы.

Я не знаю, какая должна быть абсолютна правильная реализация IPicture, потому что даже если бы я вчера делал её, я бы постарался вытеснить эту информацию из головы как можно скорее, потому что уже есть в MSDN и при необходимости может быть оттуда извлечена, усвоена и применена.

arthur2 писал(а):все OLE_ на лонги, VARIANT_BOOL на шорт.

typedef-ные псевдонимы заменять нет никакого смысла.
Что мешает тебе сделать это?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 22:01

Хакер писал(а):В данном случае, как я сказал, ошибку выбрасывает реализация Set-хендлера. Надо быть даже очень мало соображающим, чтобы понимать, что реализация Set-хендлера не может анализировать твою TLB на предмет правильности. Отсюда делаем вывод, что источником проблем может быть (остаётся только это) реализация методов.

То есть в момент set me.picture = cmypic должен вызываться один из методов интерфейса? Но бреки ни на одном из них не срабатывают.

с VARIANT_BOOL не компилировалось - видимо, объявлено где-то не в stdole2. Каждую OLE_ я по одной вылавливал и объявлял, но, заметив, что все они лонги, просто поменял их. Но это-то как раз не принципиально - всё равно бейсик их все лонгами будет считать.

Хакер писал(а):Что мешает тебе сделать это?
Что "это"? Мешает - то, что я не знаю, не только как сделать "это", но даже и что именно это "это".
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 02.10.2010 (Сб) 5:21

arthur2 писал(а):Что "это"? Мешает - то, что я не знаю, не только как сделать "это", но даже и что именно это "это".

Почитать MSDN на тему IPicture(Disp).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 02.10.2010 (Сб) 8:14

Я "почитал". Боюсь, что будь там даже всё по-русски, мало бы что понял. Я вообще не встречал внятного мануала по кому для непосвященных. Всё - для продвинутых, для тех, кто уже в теме. Ты мне тоже постоянно советуешь так, словно я эксперт и с полуслова понимаю. А мне нужно объяснять как чайнику.
Хакер писал(а):Это какой-то неправильный порочной подход. У меня все события, понятия, мысли, принципы и тому подобное обраует в голове стройное дерево отношений. Нет ничего, что висело бы просто так.
У меня такой стройности в голове относительно программирования, увы, нет. Знания мои в этой области - крайне несистемные, нахватанные.

Ладно, ну её нафиг, эту IPicture
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 02.10.2010 (Сб) 8:35

arthur2 писал(а):У меня такой стройности в голове относительно программирования, увы, нет. Знания мои в этой области - крайне несистемные, нахватанные.

Не может быть стройности относительно программирования. Должно быть стройность относительно понимания и восприятия мира. И знания — должны быть не как битмап, а как процедурная текстура.

Что касается отсутствия вызовов: ну так может ей Disp-интерфейс хочется.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 02.10.2010 (Сб) 10:10

Дисп-интерфейс не хочет имплементиться - бейсик говорит, что в нем есть области данных... Что это?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 02.10.2010 (Сб) 10:17

Disp просто сделай основным интерфейсом класса. Т.е. выдай DispId-ы нормальным методам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 02.10.2010 (Сб) 10:34

Объясни понятнее, пли-из :)
Артур
 
   

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение SLIM » 02.10.2010 (Сб) 15:49

arthur2 писал(а):Я вообще не встречал внятного мануала по кому для непосвященных

Могу посоветовать один материал по COM-у, для программистов на сях и на VB в одном месте.
Т.е. там все описывается как для чайника почти.
Пишите жизнь на чистовик.....переписать не удастся.....

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 02.10.2010 (Сб) 17:39

SLIM, посоветуй!!!
Артур
 
   

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение SLIM » 02.10.2010 (Сб) 18:18

Модель COM и применение ATL 3.0. Эффективная разработка приложений типа клиент\сервер
Автор Эндрю Трельсен
Пишите жизнь на чистовик.....переписать не удастся.....

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 02.10.2010 (Сб) 20:23

Спасибо! Нашел, скачал, пошел читать :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 08.10.2010 (Пт) 6:08

Пробую сымитировать предложенный способ на своих самодельных объектах и интерфейсах. Итак, нам нужен некий объект некоего класса, поддерживающий некий интерфейс и ещё один класс, поддерживающий тот же интерфейс. Так же, как объект Me.Picture класса StdPicture, поддерживающий интерфейс IPicture, и наш собственный класс, поддерживающий тот же интерфейс. В оконцовке должно получится Set Me.Picture = New VeryNonStdPicture

Интерфейс ITest, символизирующий IPicture:
Код: Выделить всё
Public Function doSomething(testVar As String) As String

End Function


Класс StdTest, символизирующий StdPicture.
Код: Выделить всё
Option Explicit

Implements ITest

Private Function ITest_doSomething(testVar As String) As String
  MsgBox testVar, , "from interface"
End Function

Public Function doSomething(testVar As String) As String
  MsgBox testVar, , "from method"
 
End Function

И наконец наш собственный класс cMyTest, реализующий тот же интерфейс, что есть и в StdTest:
Код: Выделить всё
Option Explicit

Implements ITest

Private Function ITest_doSomething(testVar As String) As String
    MsgBox testVar, , "from new class"
End Function


Пробуем:
Код: Выделить всё
Sub main()
    Dim pc As New stdTest 'объект рс будет символизировать me.picture
   
'   Dim i As ITest  ' проверим, что всё работает
'   pc.doSomething "lalala"
'    Set i = pc
'   i.doSomething "trampampam"
   

    Set pc = New cMyTest
'так же, как  Set Me.Picture = New VeryNonStdPicture     
'Несоответствие типа!
End Sub


Так что твой метод не работает :(
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 08.10.2010 (Пт) 6:11

Мой метод работает, просто твой код воспроизводит не мой метод, а что-то левое.

Объясняю:
У тебя:
  • Класс StdTest.
    Поддерживает интерфейсы:
    • Интерфейс _StdTest
    • Интерфейс ITest
  • Класс cMyTest.
    Поддерживает интерфейсы:
    • Интерфейс _cMyTest
    • Интерфейс ITest

Делая Set pc = New cMyTest ты пытаешься у объекта класса cMyTest запросить интерфейс _StdTest. Естественно, класс cMyTest не поддерживает _StdTest, а поддерживает только _cMyTest и ITest.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 08.10.2010 (Пт) 6:34

Ты объясняешь, почему не работает так, как я написал. А нужно - как написать так, чтобы работало :D
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 08.10.2010 (Пт) 6:36

arthur2 писал(а):Ты объясняешь, почему не работает так, как я написал. А нужно - как написать так, чтобы работало :D

Я должен написать за тебя рабочую реализацию IPicture(Disp)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 26

    TopList