Из Activex dll вызвать процедуру вызвавшего ее exe-ника.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Из Activex dll вызвать процедуру вызвавшего ее exe-ника.

Сообщение Matew » 08.02.2008 (Пт) 10:01

Приложение (на дельфи, но это имеет мало значения, кроме того, что там я не нашел GetRef) вызывает Activex dll. Надо теперь из Activex dll вызвать процедуру прложения. В какую сторону копать?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение Хакер » 08.02.2008 (Пт) 16:37

Что значит "приложение вызывает ActiveX dll" ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.02.2008 (Пт) 16:43

Matew
Передаёшь указатель и вызываешь
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 09.02.2008 (Сб) 10:58

в DLL должен быть опредлён класс (интерфейс), EXE должен его имплементировать и передать ссылку на класс в ДЛЛ.
Длл вызовет любой метод думая чтоэто её класс.))) ну, вот так объяснил.))))


ДЛЛ-----
Public Class DllClass
Sub Go
End Sub
end Class

--класс который уже вызвал ехе, тоесть он уже есть у Тебя

Public Class MainClass
sub RegisterCallBack(cb as dllclass)
--сюда приходит класс из ехе, который предоставляет медоды в самом ЕХЕ
end sub
end class


EXE---------------------------

Public EXEClass
implements DLLCLASS

Sub Go
'процедура вызываемая из ДЛЛ
end sub
ed class


Sub Main
Dim dll as new mainclass ' подымае класс в длл

dll.RegisterClassBack(new exeClass) 'отсылаем в длл объект обратного вызова


всё)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Из Activex dll вызвать процедуру вызвавшего ее exe-ника.

Сообщение jangle » 09.02.2008 (Сб) 11:30

Matew писал(а):Приложение (на дельфи, но это имеет мало значения, кроме того, что там я не нашел GetRef) вызывает Activex dll. Надо теперь из Activex dll вызвать процедуру прложения. В какую сторону копать?


В DLL, передаешь указатель на функцию EXE файла которую надо вызывать, затем уже из DLL файла, вызываешь функцию экзешника, используя указатель на вызываемую функцию

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

Сообщение ANDLL » 09.02.2008 (Сб) 14:35

Нормальный способ сказал Sebas. Единственный комментарий - можно обойтись без особого интерфейса, если использовать автоматизацию.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.02.2008 (Пн) 4:17

Хакер, понимаю, что не правильно выразился. Вот так вызываю:
Set dll = CreateObject("Dll.class")
call dll.sub()
keks-n, jangle, пробовал. Вот примерно так(тут все попытки):
ЕХЕ:
Код: Выделить всё

//function tests(S: string):integer;stdcall;
//begin
//  showmessage(s);
//end;
H:=GetModuleHandle(0);
//H:=GetModuleHandle('unit1');
  P:=GetProcAddress(H,'tests');
  dll.test(h,p('d'));

Длл:
Код: Выделить всё
Sub Ignore(parametr)
End Sub

Public Function Test(ByVal Handler, ByVal proc)
'    CallWindowProc Handler, 0&, 0&, 0&, 0&
'Dim pa
'    pa = GetProcAddress(Handler, "tests")
'    pa ("Yflj")
CallWindowProc proc, frmMain.hwnd, 0&, 0&, 0&
'     Ignore (proc("dfs"))
End Function

Не вышло. Как надо?
Sebas, спасибо, на ВБ работает.
ANDLL, а можно про способ без интерфейсов по подробнее, а то чувствую с портированием на дельфи будут проблемы?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

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

Matew
Вообще то, адрес callback-а нужно определять средствами Delphi ( addr: = @tests(); )? а ни каким не GetProcAddress. GetProcAddress делает следующее:
1) Проверяет, действительно ли ModuleHandle - адрес загруженного модуля. Проверяет, действительно ли по указанному адресу лежит MZ-хеадер. Если так, смотрит lfanew, проверяет, действительно ли там лежит PE-хеадер. Если да, ищет в таблице экспорта RVA функции, чьё имя совпадает со вторым аргументом. Когда находит RVA, прибавляет к нему первый аргумент и полученный результат возвращает тебе.
У твоего EXE таблицы экспорта нет. Даже если и есть, функции tests там скорее всё равно нет.

Так что GetProcAddress в данном случае бесполезен, а его использование вызывает улыбку на лице :)


Передавать нужно только его (никаких Handler-ов, хотя само слово Handler здесь неуместо).

Почему аргументы у метода Test имеют тип Variant? :? Разве есть такая необходимость?

Вобщем:
Delphi:
Код: Выделить всё
function tests(S: BSTR, nullart1: integer, nullarg2: integer, nullarg3: integer):integer;stdcall;
begin
  showmessage(s);
end;

// ... ... ...

MyPtr: Pointer

// ...

MyPtr:=@tests;

dll.test(integer(MyPtr));


VB:
Код: Выделить всё
Public Function Test(ByVal lProcAddress As Long)
  CallWindowProc lProcAddress ,StrPtr("Мама мыла раму"), 0&, 0&, 0&
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.02.2008 (Пн) 9:49

2 ALL, код, предложенный Хакером работает для ActiveX dll, но не работает для ActiveX EXE(а мне надо имеенно для него, т.к. http://bbs.vbstreets.ru/viewtopic.php?t=35711) :( . Так что вопрос остается открытым.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.02.2008 (Пн) 10:39

Ну а почему никто не подумал про события?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 18.02.2008 (Пн) 10:46

Andrey Fedorov, про события подумал Хакер в личной беседе. На Вб все работает, а вот как из Дельфи ловить события АктивИкс-ов я не знаю. :(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.02.2008 (Пн) 10:53

Matew писал(а):Andrey Fedorov, про события подумал Хакер в личной беседе. На Вб все работает, а вот как из Дельфи ловить события АктивИкс-ов я не знаю. :(


Когда-то я делал DLL-ку которую юзали под Delphi - события там были и все работало без проблем. Но Дельфийскую часть делал не я, так что ничего об этом сказать не могу...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Народный треп

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

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

    TopList