Как создать экспорт в exe-шке?

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

Как создать экспорт в exe-шке?

Сообщение 0xy » 12.01.2007 (Пт) 5:45

Собственно вопрос: как поместить ссылку на свою функцию в таблицу экспорта?

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

Сообщение jangle » 12.01.2007 (Пт) 11:19

Собственно вопрос: как поместить ссылку на свою функцию в таблицу экспорта?


Экспорта чего? EXE, DLL ? Может ты экспорт с импортом перепутал?

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 12.01.2007 (Пт) 11:51

0xy
У линкера link.exe есть параметр /def:имя_файла
Думаю, если сначала заменить vb-шный линкер своей программой, которая будет вызывать настоящий линкер с этим параметром и передавать свой def-файл, то все будет ok.
Может ты экспорт с импортом перепутал?
Не он, скорее ты)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.01.2007 (Пт) 12:20

А начать надо с вопроса зачем?
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.01.2007 (Пт) 12:23

Ну мало ли зачем. Хочет человек не ActiveX, а Native DLL сделать. Либо просто для интереса.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение jangle » 12.01.2007 (Пт) 12:26

Не он, скорее ты)


Это почему? :)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.01.2007 (Пт) 12:34

jangle
Если человек хочет действительн написать Native DLL, то ему надо вписацца в таблицу экспорта естественно. Зачем ему импорт то?

Сделать это возможно как написано в посте _ae_. можно на эту тему почитать стать GSerg на http://www.vbstreets.ru или посмотреть на [url]forum/sources.ru[/url] в разделе по VB. Было там подобное обсуждение...

Но проблем с реализацией будет немерянно


З.Ы. почто в названии топика упоминается exe-шник? Автор опечатался?
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение jangle » 12.01.2007 (Пт) 12:41

У линкера link.exe есть параметр /def:имя_файла
Думаю, если сначала заменить vb-шный линкер своей программой, которая будет вызывать настоящий линкер с этим параметром и передавать свой def-файл, то все будет ok.


Да велика у наших людей страсть к мазохизму! :D Ты забыл еще добавить, что скомпилированную таким образом DLL можно вызвать только из VB. Из любого друго компилятора - не получится, значит пользователи Дельфи и VC++ идут лесом.

Ну мало ли зачем. Хочет человек не ActiveX, а Native DLL сделать. Либо просто для интереса.


Если надо создать Native DLL, лучше юзать PowerBASIC. Библа будет работать с любыми компиляторами, а не только с VB.
Вот пример простейшей Native DLL, после компиляции получаем test.dll объемом 6 кбайт:

Код: Выделить всё
#Compile Dll "test.dll"

Function ExportFunction Alias "ExportFunction" (ByVal p As String) Export As String
     MsgBox p
End Function



Пример вызова этой библы из VB:

Код: Выделить всё
Private Declare Function ExportFunction Lib "test.dll" Alias "ExportFunction" (ByVal p As String) As String   

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

Сообщение tyomitch » 12.01.2007 (Пт) 12:46

jangle писал(а):Да велика у наших людей страсть к мазохизму! :D Ты забыл еще добавить, что скомпилированную таким образом DLL можно вызвать только из VB. Из любого друго компилятора - не получится, значит пользователи Дельфи и VC++ идут лесом.

Сомнительно. Я даже пример CPL на VB6 видел.


Топики про создание нативных DLL на этом форуме уже были. И линкер подменяли, и что угодно. Эка невидаль...
Изображение

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

Сообщение jangle » 12.01.2007 (Пт) 12:47

Топики про создание нативных DLL на этом форуме уже были. И линкер подменяли, и что угодно. Эка невидаль...


я знаю эти топики, и пытался использовать этот механизм компиляции в Native DLL столкнулся с граблями, что DLL работает только с VB. Дельфи и VC при вызове выбрасывают GPF, там какая-то нестыковка VB рантайма и механизма загрузки Windows DLL. Короче не предназначен VB для создания Native dll, вот и не работает



З.Ы. почто в названии топика упоминается exe-шник? Автор опечатался?


А что разве в экзешнике не может быть экспорта? :wink:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.01.2007 (Пт) 15:16

Может, но зачем экзешнику эспорт? Вопрос конечно риторический, но все же лучше экспортируемые функции в DLL помещать. Они для того и предназначены.

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

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

Сообщение tyomitch » 12.01.2007 (Пт) 15:26

!Viper! писал(а):Насчет мазохизма... Оно конечно да, но вот тут проблема создания Native DLL очень подробно обсуждена и многие подводные камни успешно ликвидированы. Так что все можно сотворить

Прочитал первую страницу, там сплошной бред.
Дальше читать не стал.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.01.2007 (Пт) 15:38

там дальше бред постепенно исчезал по мере уменьшения наивности
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение jangle » 12.01.2007 (Пт) 15:44

Может, но зачем экзешнику эспорт?


Во многих случаях это просто необходимо. Например приложение-сервер, дабл кликом запускается как обычный экзешник, но в то-же время можно использовать его как DLL библиотеку. Подключаешь хедер к с описанием функций, и юзаешь EXE как компонент твоей проги. Не нужно передавать параметры через командную строку, а потом ловить консольный вывод. Очень удобно!

Насчет мазохизма... Оно конечно да, но вот тут проблема создания Native DLL очень подробно обсуждена и многие подводные камни успешно ликвидированы. Так что все можно сотворить


Ради интереса скачал, скомпилировал пример DLL. Попытался вызвать ее из PowerBASIC. Результат - GPF, деббагер проваливается куда-то в недра MSVBVM60.DLL.
Не работало в 2004 году, не работает и сейчас...

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

Сообщение jangle » 12.01.2007 (Пт) 16:14

Кстати, с секций экспорта в EXE возможен интересный изврат:

Код: Выделить всё
#Compile Exe "test.exe"
#Dim All

Declare Function Msg  Lib "test.exe" Alias "F1"  (ByVal p As String) As Long 'Импортируем функцию F1 из test.exe

Function F1 Alias "F1" (ByVal p As String) Export As Long
    MsgBox p
End Function

Function PBMain () As Long
    Msg "HELLO" 'Вызываем собственную функцию через секцию экспорта
End Function
                         


Это пример на PB. Здесь функция F1 (заалиасенная Msg) вызывается через секцию экспорта собственного экзешника. Нафиг это нужно, мне непонятно. Но все работает. Может майкрософт сделала эту фичу для каких-то малопонятных системных целей?

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

Сообщение tyomitch » 12.01.2007 (Пт) 17:20

В стародавние времена (Win10 и, кажется, Win2x) длл-ек не было совсем, и функции экспортировались из обычных ехе, которые при запуске говорили "не кликай по мне, я не прога". Потом договорились переименовывать незапускаемые проги в .длл, чтобы юзеры в них почём зря не тыкали. Разницы между ехе и длл как не было, так и нет.
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 12.01.2007 (Пт) 18:05

И для полноты картины (точнее, для просвещения автора) дам линк на доки по PE-формату. Имхо легче самому сделать то, что нужно, чем не имея должного опыта, ковырять чужие коды...
А я все практикую лечение травами...

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 14.01.2007 (Вс) 1:12

Я спросил, существует ли в VB аналоп делфового
Код: Выделить всё
procedure [ProcName]
begin
...................
end;
EXPORTS
   [ProcName];

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

Сообщение ANDLL » 14.01.2007 (Вс) 2:15

0xy
Да. Прям берешь, создаешь DEF-файл и пишешь там свои EXPORTS. А потом подменяешь аргументы линкеры и усе.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


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

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

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

    TopList