Достать функцию из DLL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Достать функцию из DLL

Сообщение seelts » 06.10.2005 (Чт) 17:10

Пишу:
Код: Выделить всё
lb = LoadLibrary("myDLL")'здесь всё хорошо (lb > 0)
pa = GetProcAddress(lb, "myProc")'здесь всё плохо (pa = 0), хотя GetLastError говорит что Операия Завершена Успешно

myProc(Паблик) в myDLL(АктивХ ДЛЛ) точно есть так как я её сам писал, но "хэндл" на неё не возврашается... и ГетЛастЕгор молчит падла... пробовал запустить пример из Апи-Гайда(Call Procedure) - Васька вылетает и всё тут...
MSDN писал(а):...
The export mechanism used here is the __declspec(export)
method supported by Microsoft Visual Studio, but any
other export method supported by your development
environment may be substituted.
...

что за механизмы экспорта? как это можно использовать в Ваське? в МСДН только про С пишут... сволочи.
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.10.2005 (Чт) 17:19

так она у тебя ActiveX DLL? зачем ты тогда все это делаешь?

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 06.10.2005 (Чт) 17:37

потому что есть такая гадкая апи-функция SetWindowsHookEx, она в определённых случаях требует чтобы нужная мне процедура выполнялась из отдельной ДЛЛки. в примерах делается с помощью LoadLibrary и GetProcAddress...
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.10.2005 (Чт) 17:59

Скорее всего, pascal преобразует все имена в верний регистр. Попробуй MYPROC.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.10.2005 (Чт) 18:55

ANDLL писал(а):Скорее всего, pascal преобразует все имена в верний регистр. Попробуй MYPROC.

Методы ActiveX-компонентов - не экспортируемые функции, и имён у них нет. Ни в верхнем регистре, ни в каком.

seelts писал(а):потому что есть такая гадкая апи-функция SetWindowsHookEx, она в определённых случаях требует чтобы нужная мне процедура выполнялась из отдельной ДЛЛки. в примерах делается с помощью LoadLibrary и GetProcAddress...

А как насчёт подумать, вместо тупо копировать примеры? :evil:


Готовый пример хука в ActiveX DLL: http://bbs.vbstreets.ru/viewtopic.php?p=119512#119512
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.10.2005 (Чт) 19:31

tyomitch писал(а):
ANDLL писал(а):Скорее всего, pascal преобразует все имена в верний регистр. Попробуй MYPROC.

Методы ActiveX-компонентов - не экспортируемые функции, и имён у них нет. Ни в верхнем регистре, ни в каком.

Спасибо за открытую тайну :?
Как я понял, чел создал ActiveX Dll и экспортируемую функцию MyProc(если пасукаль это позволяет).
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.10.2005 (Чт) 20:27

ANDLL писал(а):
tyomitch писал(а):
ANDLL писал(а):Скорее всего, pascal преобразует все имена в верний регистр. Попробуй MYPROC.

Методы ActiveX-компонентов - не экспортируемые функции, и имён у них нет. Ни в верхнем регистре, ни в каком.

Спасибо за открытую тайну :?
Как я понял, чел создал ActiveX Dll и экспортируемую функцию MyProc(если пасукаль это позволяет).

Да при чём здесь Паскаль вообще? :shock:
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.10.2005 (Чт) 20:56

Сорри, прочитал в первом его посте слово Паблик как Паскаль..........
Соответственно дико извиняюсь :oops: :oops: :oops:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 06.10.2005 (Чт) 23:59

tyomitch писал(а):А как насчёт подумать, вместо тупо копировать примеры? :evil:
Ой не хорошо себя ведёшь... как ты меня можешь обвинять в "тупом" копировании если ты не знаешь что я делаю и какие примеры смотрю. там от примера ничё не осталось уже. для того я тут и вопросы задаю, потому что не знаю чё мне делать дальше...
и так вернёмся к нашим баранам:
то ты говоришь
tyomitch писал(а):Методы ActiveX-компонентов - не экспортируемые функции
а потом сразу даёшь ссылку на пример с глобальным хуком в котором идёт речь про экпортируемые функции. так можно или нет стандартными средствами Васика сделать ДЛЛ с экспортируемыми функциями?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.10.2005 (Пт) 0:10

Потому что одно дело, если ты хочешь решить задачу, и другое дело, если ты хочешь воспользоваться конкрентным методом.
Тёмыч дал ссылку на то, как сделать глобальный хук, то есть то, что тебе надо.
Если же тебе надо именно native dll, значит, либо твоя цель совсем не хук, либо ты не понимаешь, чего хочешь...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 1:18

GSerg писал(а):Потому что одно дело, если ты хочешь решить задачу, и другое дело, если ты хочешь воспользоваться конкрентным методом.

РЕШИТЬ ЗАДАЧУ - вот для чего я здесь, и я хотел бы чтобы мне указали МЕТОДЫ
И так начнём с начала:
мне надо использовать SetWindowsHookEx с параметром WH_CALLWNDPROCRET. Это говорит о том что придётся пользоваться процедурой CallWndRetProc. В МСДН сказано, что если делается хук на чужой процесс, то эта процедура должна лежать во внешней ДЛЛе. Указатель на ДЛЛ я получить могу, а вот указатель на процедуру в ней - нет. Это так скажем "официальное" решение меня ни к чему не привело т.к.
tyomitch писал(а):Методы ActiveX-компонентов - не экспортируемые функции
. Теперь оказывается есть альтернативный метод, но у его автора наверно слишком много звёзд для того чтобы снизойти до того чтобы объяснять тупым копировальщикам примеров как и что надо делать чтобы всё работало и главное - почему это работает имеено так.(
Компонент надо зарегить, TLB надо подключить. Неужели инструкцию писать? :evil:
). Допустим что компонент зарегить это понятно - это довольно часто встречается, но что за *.tlb, *.pdb, *.idl фалы? Я например в 6-ом бэсике такие файлы первый раз вижу, или это непростительный грех не знать о них?
seelts писал(а):так можно или нет стандартными средствами Васика сделать ДЛЛ с экспортируемыми функциями?
под стандартными я подразумеваю средства IDE.

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

ЗЫ2:
А как насчёт подумать, вместо тупо копировать примеры? :evil:


Готовый пример...
ОЧЕНЬ похоже на предложение "тупо скопировать пример"
А как насчёт подумать?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.10.2005 (Пт) 1:48

seelts писал(а):Это так скажем "официальное" решение меня ни к чему не привело т.к.
tyomitch писал(а):Методы ActiveX-компонентов - не экспортируемые функции
.

Правильно. Потому что официально создать native dll на VB нельзя. Неофициально можно. См. мою статью по этому поводу на форуме.
Либо разберись с примером Тёмыча.

seelts писал(а):Теперь оказывается есть альтернативный метод

Есть, один из нескольких...

seelts писал(а):но у его автора наверно слишком много звёзд для того чтобы снизойти до того чтобы объяснять тупым копировальщикам примеров как и что надо делать чтобы всё работало

Не звёзд, а времени. Времени катастрофически не хватает ни на что. У меня, во всяком случае. У него, думаю, тоже.

seelts писал(а):(
Компонент надо зарегить, TLB надо подключить. Неужели инструкцию писать? :evil:
).

Справедливо. Без обид.

seelts писал(а):Допустим что компонент зарегить это понятно - это довольно часто встречается, но что за *.tlb, *.pdb, *.idl фалы?

Tlb - ты когда-нибудь управлял, к примеру, Word'ом из VB? Подключал к проекту Microsoft Word X.X Object Library? На расширение файла этой самой library при этом не глянул?..
pdb - файл с дебажной информацией, Тёмыч их делает; так они не нужны.
idl - исходник, из которого компилируется tlb.

seelts писал(а):Я например в 6-ом бэсике такие файлы первый раз вижу, или это непростительный грех не знать о них?

Подразумевается, что человек, занявшийся тем вопросом, который занялся ты, обладает определёнными знаниями о таких вещах.
Как говорится тут, на вопрос "Как сконфигурировать приглашение командного интерпретатора?" так и просится ответ "Если вы достаточно умны, чтобы заинтересоваться данным вопросом, вы без труда найдёте ответ".

seelts писал(а):
seelts писал(а):так можно или нет стандартными средствами Васика сделать ДЛЛ с экспортируемыми функциями?
под стандартными я подразумеваю средства IDE.

Нет.
И именно поэтому Тёмыч показал, как сделать хук именно стандартными средствами.
Хочешь экспортируемые функции - на.
Однако перед этим советую открыть http://www.sysadmins.ru/rtfm/ask_howto.htm и найти в данном документе фразу "Как можно с помощью X сделать Y".

seelts писал(а):ЗЫ: почему-то в форумах где есть система рейтинга намного меньше грубых ответов...

Потому что боятся.
Снова http://www.sysadmins.ru/rtfm/ask_howto.htm, раздел "Реакция на грубость".

seelts писал(а):("тупо копировать" - меня очень задело, тем более с таким смайликом далее)

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.10.2005 (Пт) 7:56

2seelts: у меня сломалась дома сеть, поэтому в Инет хожу с модема. Плачу по времени. Писать трактаты по каждому поводу выходит накладно ;-)
Но сейчас я сижу в интернет-классе в универе, и могу себе это позволить.

1) когда ты говоришь "во всех примерах используются экспортируемые функции, значит и у меня должна быть она же" - значит ты не понимаешь как именно работает хук. Ему на самом деле совершенно всё равно, экспортируемую функцию дать, не экспортируемую, или даже вообще не функцию. Просто с экспортируемой функцией удобнее.

2) методы ActiveX-компонентов - не экспортируемые функции. ANDLL на это замечание обиделся, а для тебя, похоже, и это новость.

3) созданные хакерскими методами Native DLL на VB не подходят для установки хуков, мы с GSerg это уже проверяли. Т.е. мой метод - вроде как единственный работоспособный пример хука на VB.

4) этот пример я тебе дал исключительно для того, чтобы направить на "истинный путь", в сторону от так увлёкших тебя LoadLibrary и GetProcAddress, которые здесь совершенно не при чём.

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

6) ещё раз: я хотел помочь. Если моя помощь в том виде, в котором я могу её предоставить, тебя не устраивает, просто не читай мои посты: это тебе будет проще всего.
Когда-нибудь gaidar наконец приделает, по многочисленным просьбам, возможность игнора, и это станет ещё проще.




Теперь предметно, конкретно, и детально:

seelts писал(а):и так вернёмся к нашим баранам:
то ты говоришь
tyomitch писал(а):Методы ActiveX-компонентов - не экспортируемые функции
а потом сразу даёшь ссылку на пример с глобальным хуком в котором идёт речь про экпортируемые функции. так можно или нет стандартными средствами Васика сделать ДЛЛ с экспортируемыми функциями?


Этот пример - как раз иллюстрация того, что для хука не нужны экспортируемые функции, и в том топике он давался именно в таком контексте.
Прочитай, пожалуйста, тот топик целиком.

В примере речь об экспортируемых функциях не идёт. В примере речь вообще ни о чём не идёт, там и комментариев-то почти нет ;-)

Средства, которыми создан тот пример, на 100% стандартные. Даже mktyplib (прога, которой компилируется TLB) - идёт вместе с VB. Но это не IDE. А чем тебе так понравилась IDE, что ты не хочешь выходить за её пределы ни на шаг?
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 11:22

ну вот - вроде конструктивный диалог пошёл... 8)
GSerg писал(а):Правильно. Потому что официально создать native dll на VB нельзя. Неофициально можно. См. мою статью по этому поводу на форуме
дай ссылочку плиз.
*.tlb: не управлял, не пдоключал, не глядел - просто не надо было. Так где про это почитать?
*.pdb: это расширение я видел в Visual Studio .NET как эти файлы сделать в 6-ой студии и для чего они могут пригодиться?
*.idl: в этих фалах ручками чтонить надо менять или они создаются как промежуточные без моего участия?
GSerg писал(а):Подразумевается, что человек, занявшийся тем вопросом, который занялся ты, обладает определёнными знаниями о таких вещах
у каждого чтото бывает впервые.
tyomitch писал(а):5)...
не работает. сразу обратил внимание на то что AddressOfHookProc в Form_Load'е почему то слитно пишется... но даже если и не слитно то всё равно HookProc не будет доступна - она же в другом проекте. Ещё раз напомню что такое TLB я не знаю - VBA никогда не занимался.

не хотел писать но таки напишу...ЗЫ: иногда говорят: "не бойтесь спрашивать" - лукавят наверно... 8). я так скажу: "не бойтесь объяснять"
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 11:33

GSerg писал(а):См. мою статью по этому поводу на форуме
эту?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.10.2005 (Пт) 11:37

Эту.
Только зачем она тебе? Прочитай Тёмыча ещё раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 12:02

как зачем? когда закончу (если закончу конечно) этот проект - мне же надо будет придумать чем людей дальше мучать... 8)
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.10.2005 (Пт) 15:28

seelts писал(а):*.tlb: не управлял, не пдоключал, не глядел - просто не надо было. Так где про это почитать?

В MSDN, где ж ещё :-)
А что именно интересно?
seelts писал(а):*.pdb: это расширение я видел в Visual Studio .NET как эти файлы сделать в 6-ой студии и для чего они могут пригодиться?

Сделать: Project -> Properties -> Compile -> Create Symbolic Debug Info.
Пригаживаются для отладки скомпилированных прог.
seelts писал(а):*.idl: в этих фалах ручками чтонить надо менять или они создаются как промежуточные без моего участия?

Это исходник для TLB. Если ты TLB перекомпилировать не собираешься, можешь IDL вообще удалить, чтобы он тебе глаза не мозолил.

seelts писал(а):
tyomitch писал(а):5)...
не работает. сразу обратил внимание на то что AddressOfHookProc в Form_Load'е почему то слитно пишется... но даже если и не слитно то всё равно HookProc не будет доступна - она же в другом проекте.

Так надо.

А как именно не работает? Ошибки показывает, или просто часы не расширяет?

seelts писал(а):Ещё раз напомню что такое TLB я не знаю - VBA никогда не занимался.

TLB к VBA имеет крайне мало отношения. TLB - это одна из основ COM.
Например, при компиляции любого ActiveX-компонента в VB автоматически генерируется TLB и впихивается в ехе-шник. Можно создавать TLB и самому, как сделал я в том примере.
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 15:52

Прога работает, просто я не нашёл
Я просто убрал и опять поставил часы - они после этого расширилсиь.
Теперь мне не понятен принцип работы проги:
в ехе_шнике указывается адресс процедуры в ДЛЛ, но указывается он благодаря использованию этих самых ТЛБ - так чтоли? этот ТЛБ относится к ДЛЛке или он ваще не к чему не относится - просто связуещее звено? вобщем как его сделать?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.10.2005 (Пт) 16:31

seelts писал(а):Прога работает, просто я не нашёл

Шеврон (стрелка влево) в левом краю трея.

seelts писал(а):Теперь мне не понятен принцип работы проги:
в ехе_шнике указывается адресс процедуры в ДЛЛ, но указывается он благодаря использованию этих самых ТЛБ - так чтоли?

Нет. Как легко увидеть, AddressOfHookProc - это публичный метод класса clsHook.

seelts писал(а):этот ТЛБ относится к ДЛЛке или он ваще не к чему не относится - просто связуещее звено?

Относится к ДЛЛке, а именно содержит объявления вызываемых из неё функций (вместо Declare).

seelts писал(а):вобщем как его сделать?

mktyplib Declares.idl
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 16:44

ясно - просто я шевроном (прикольное слово) не пользуюсь.
то что AdressOfHookProc - метод класса я увидел, но чтобы им пользоваться надо создать экземпляр этого класса - где он объявляется?
откуда берётся declares.idl?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.10.2005 (Пт) 17:04

seelts писал(а):то что AdressOfHookProc - метод класса я увидел, но чтобы им пользоваться надо создать экземпляр этого класса - где он объявляется?

Класс clsHook объявлен как GlobalMultiUse. Его экземпляр создаётся автоматически.

seelts писал(а):откуда берётся declares.idl?

Пишется руками. Например, в Блокноте.
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 23:20

Вот!!! становится ещё теплее! Т.е. если я создаю GlobalMultiUse класс и подлючаю его через Проект-Референсес то я могу использовать методы и свойства этого класса даже не делая [Dim ob as myclass и тд...]?
*.idl - исходник для ТЛБ, пишется в любом текс. редакторе. по каким правилам пишется, и что это там за язык такой? нужны умные ссылки...
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.10.2005 (Пт) 23:40

seelts писал(а):по каким правилам пишется, и что это там за язык такой? нужны умные ссылки...

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

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 07.10.2005 (Пт) 23:47

ясно.
ещё вопрос (а то вдруг сам ответ найду ;-) ): файл должен называться Declares.idl и лежать в папке с проектом? или его имя и местоположение гдето указывается?
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.10.2005 (Пт) 23:53

Файл должен компилироваться утилитой MIDL и готовый tlb-файл подключается через Projecet->referencies.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2005 (Сб) 8:49

seelts писал(а):Вот!!! становится ещё теплее! Т.е. если я создаю GlobalMultiUse класс и подлючаю его через Проект-Референсес то я могу использовать методы и свойства этого класса даже не делая [Dim ob as myclass и тд...]?

Угадал! :-)

seelts писал(а):файл должен называться Declares.idl и лежать в папке с проектом? или его имя и местоположение гдето указывается?

IDL-файл может называться как угодно и лежать в произвольном месте. То же верно и для TLB, но принято давать ему расширение TLB ;-)

ANDLL писал(а):Файл должен компилироваться утилитой MIDL и готовый tlb-файл подключается через Projecet->referencies.

mktyplib-ом проще.
midl требует сишные хедеры, добавляет в TLB больше мусора, и не поставляется с VB.
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 08.10.2005 (Сб) 15:06

Более детальный разбор:
Код: Выделить всё
hWndClk = GetDlgItem(GetDlgItem(FindWindow("Shell_TrayWnd", vbNullString), &H12F&), &H12F&)
Откуда взялось &H12F& ? На эти местах должны быть "идентификаторы контролов" - и вообще как их узнать эти идентификаторы? и зачем вообще так усложнять когда можно было просто искать класс "TrayClockWClass"
В чём смысл этой проверки:
Код: Выделить всё
If 0 = FindAtom(MsgName) Then
? Чтобы DoDirtyBusiness() выполнилась только один раз? Почему просто не проверять какуюнибудь Boolean'овую переменную?
Код: Выделить всё
''<credits> This code is (c) Matt Curland, 1999
    CoInitialize 0
Dim IID_IUnknown As IID, pUnk As IUnknown
    With IID_IUnknown
        .Data4(0) = &HC0
        .Data4(7) = &H46
    End With
    CoCreateInstance CLSIDFromProgID(ProgID), Nothing, CLSCTX_INPROC_SERVER, IID_IUnknown, pUnk
    Set Bogus = pUnk
''</credits>
- это чё такое вообще? ни строчки не понял.

Зачем проверять WM_USER+100? ведь это даже не системное сообщение. откуда оно будет браться?
И зачем нужно сообщение WM_OURS? В каком месте оно посылается?
Но это всё не так важно - это больше к расширению часиков относится. Самое главное:я так и не смог в МСДН найти нормального описания idl файлов. Т.е. основные "команды, ключевые слова" с описанием я нашёл, но не нашёл описания алгоритма составления этих файлов. Понял только что сначала идёт [Interface Header] а потом {Interface Body}. Не понятно даже откуда брать цифры в uuid()
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2005 (Сб) 17:29

&H12F - это и есть "идентификаторы контролов", взялось из Spy++
TrayClockWClass искать тоже было можно: см. http://bbs.vbstreets.ru/viewtopic.php?p=64240#64240

Смысл проверки: глобальные переменные создаются только на строке CoCreateInstance ..., до этого ими пользоваться нельзя.

Код от Мэтта Курланда: забей, главное что работает ;-)
Тайный смысл в том, что контекст VB-проги создаётся только тогда, когда в ней создаётся первый объект. Если мы вошли в DLL не через DllGetClassObject, то этот объект приходится создавать руками.

WM_USER+100 шлётся треем часам, чтобы узнать их размеры (см. http://bbs.vbstreets.ru/viewtopic.php?p=64000#64000 )

WM_OURS шлётся из prjUseHook, чтобы выгрузить хук.

Цифры в uuid() ставятся случайные. Для этого есть специальный генератор, guidgen. А можно вызывать API CoCreateGuid самому.
Изображение

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 11.10.2005 (Вт) 1:16

просмотреть форум не мог - инета не было, но просмотрев ничё нового не нашёл. т.е. что такое *.тлб, для чего они нужны и как писать *.идл я так и не понял. от скуки - пока не было инета - решил попробовать сделать без ТЛБ - процедура (из модуля, который в классе - всё это ДЛЛ) вызывается, но как только приложение (чей контрол я хукаю) получает сообщение (я так понял что любое сообщение) - оно(приложение) вылетает. вобщем чую что захожу в тупик - придётся посвятить себя поискам знаний о тлб.

ЗЫ: лирическое отступление. честно говоря эта ситуация меня просто бесит. писал себе, писал на ВБ, конечно много не знал (в осном функции), но если вдруг чтото становилось нужным, то узнать об этом не составляло никакого труда и всегда это было что-то типа "что-то новое об элементах или функциях Бэйсика [+ новая АПИфункция]". тут вдруг появляется какое то тлб - не понятно что такое, к чему относится и почему-то ранее невстречавшееся. появляется такое чувство что всё что я делал до этого делалось в полном неведении того что я делал, что есть какието технологии, которые редко используются в повседневном кодинге (по крайней мере на форумах я про тлб вообще никогда не слышал), что технологии хитрые и открывающие "тайные дверки". и тут невольно появляется вопрос - а чего ещё я не знаю? сколько ещё таких технологий? и самое главное - недоумевание: почему нет какого-либо места, где перечисленны ВСЕ эти самые технологии и даны ссылочки на их описание. по идее это должно быть в МСДН, но там нет такой странички где всё было бы перечисленно - плохо всё это.
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 87

    TopList