Как изменить путь к DLL?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 12:51

Private Declare Function Sum Lib "TG.dll" (a As Integer, b As Integer) As Integer
Моя библиотека - мне необходимо изменить путь к ней в ее объявлении.
То есть при Lib "TG.dll" она ищет ее в "\System32\TG.DLL". Как загрузить ее из каталога где лежит моя прога?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как изменить путь к DLL?

Сообщение Mikle » 14.10.2013 (Пн) 15:10

Сделай текущей папку, где лежит DLL, вызови какую-нибудь функцию из неё. Теперь можно вернуть прежнюю текущую папку, DLL уже не потеряется.

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 14.10.2013 (Пн) 15:52

Есть мой кирпич — «вызов функций по указателю», добавляющий очень «вкусную» поддержку указателей на функции, которые ведут себя с одной стороны как переменные (которым можно присвоить любое значение), а с другой — допускают вызов, причём типизированный (с проверкой числа и типов аргумента), но с мерзкой unicode→ansi→unicode конвертацией для строк (легко обходится).

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

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

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 17:36

Mikle писал(а):Сделай текущей папку, где лежит DLL, вызови какую-нибудь функцию из неё. Теперь можно вернуть прежнюю текущую папку, DLL уже не потеряется.

Можно подробнее? Пример хотя бы...

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 17:38

Хакер писал(а):Есть мой кирпич — «вызов функций по указателю»

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как изменить путь к DLL?

Сообщение iGrok » 14.10.2013 (Пн) 18:05

Don Leno писал(а):Можно подробнее? Пример хотя бы...

Пример ЧЕГО?! Смены текущей папки? Пример использования ChDir, что ли, нужен?
label:
cli
jmp label

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 18:18

iGrok писал(а):
Don Leno писал(а):Можно подробнее? Пример хотя бы...

Пример ЧЕГО?! Смены текущей папки? Пример использования ChDir, что ли, нужен?

Ссори я тебя наверное неправильно понял... спс!
Затупил бывает :D

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 18:30

Mikle писал(а):Сделай текущей папку, где лежит DLL, вызови какую-нибудь функцию из неё. Теперь можно вернуть прежнюю текущую папку, DLL уже не потеряется.

просьба дай пример полный у меня чет не получается. Вроде так просто, а не могу сделать! :evil:

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.10.2013 (Пн) 18:37

Mikle писал(а):Сделай текущей папку, где лежит DLL, вызови какую-нибудь функцию из неё.

Просто подумал. Смысл вызова ведь в том, чтобы сохранился указатель на функцию. А ято если не вызывать саму функцию, а передать её в другую? VB же должен будет получить указатель в таком случае? Тогда получится отсутствие необходимости иметь в dll всякие левые функции.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 18:40

Удалено!
Последний раз редактировалось Don Leno 14.10.2013 (Пн) 18:45, всего редактировалось 1 раз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.10.2013 (Пн) 18:40

Don Leno, вопрос был не тебе.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 14.10.2013 (Пн) 18:46

Qwertiy писал(а):Don Leno, вопрос был не тебе.
I'm Sorry

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

Re: Как изменить путь к DLL?

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

Qwertiy писал(а):А ято если не вызывать саму функцию, а передать её в другую?

Кого передать? Куда передать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.10.2013 (Пн) 21:49

Хакер писал(а):Кого передать? Куда передать?

Функцию, куда угодно. Т. е. есть объявление
Код: Выделить всё
Private Declare Function DoSmth Lib "smth.dll" () As Long
Если вместо вызова
Код: Выделить всё
DoSmth
передадим её как параметр
Код: Выделить всё
SomeMyFunc(AddressOf DoSmth)
то получим тот же эффект, что функция уже связана с нужной библиотекой и она больше искаться не будет?

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 8:02

Не получится. Нельзя AddressOf применять к Declare-функции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 9:10

Хакер писал(а):Нельзя AddressOf применять к Declare-функции.

Оу.. А с какой целью такое ограничение?

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 12:46

Ограничения (именно в такой формулировке) нет.

AddressOf применим только к функциям, сделанным программистом. Ты не можешь применить AddressOf к declare-функциям, не можешь применить его к TLB-функциями (например, ты не можешь применить его к MsgBox).

Глубинный смысл этого вот в чём:
  • Изначально считалось, что никому не нужно иметь адрес фукнции. Нет задач, для решения которых это было бы нужно. Никого же не смущает, что в JS нельзя получить адрес функции? Тем не менее, AddressOf ввели как лазейку — для того, чтобы можно было вызывать WinAPI, например функцию EnumWindows, которой нужен callback. При этом, понятно, что чужие функции, объявленные через TLB (куда входят встроенные, типа MsgBox, и реально чужие), и declare-функции, которые в 90 процентах случаев соответствуют WinAPI-функциями, — что их никто в качестве callback-ов использовать не будет. Поэтому и не сделали.
  • Когда AddressOf применён к функции, являющейся частью текущего проекта, он компилируется в просто константу.
    Код: Выделить всё
    Call DoSomething (AddressOf Foo)

    Скомпилируется в
    Код: Выделить всё
    push 1234
    call DoSomething


    В случае с Declare-функциями, пришлось бы делать усложнение в компиляторе: для TLB-функций ссылаться там на IAT, для Declare-функций — на внутреннюю таблицу указателей для Declare-функций (таблица отложенного Declare-импорта).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 12:54

Хакер писал(а):В случае с Declare-функциями, пришлось бы делать усложнение в компиляторе

Понятно. Спасибо.

Хакер писал(а):Никого же не смущает, что в JS нельзя получить адрес функции?

Эм.. Адрес нужен только ради вызова. А передать функцию, чтобы её потом вызвать в js вполне можно. Более того, там почти всё на этом построено ;)

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 13:05

Qwertiy писал(а):Эм.. Адрес нужен только ради вызова. А передать функцию, чтобы её потом вызвать в js вполне можно. Более того, там почти всё на этом построено ;)

Неправильная логика. В VB обладание адресом не даёт тебе возможность вызвать её. Оно даёт тебе просто бесполезное число (бесполезное без моего кирпича). И в js тебе никто не даёт адрес. Тебе дают объект, олицетворяющий функцию.

Точно так же и тут. Тут оригинальная идея была в том, что функции в модулях оставили как костыль. А вообще: «ООП — наше всё». Поэтому, вместо указатель на функции надо использовать ссылки на интерфейсы, поддерживающие нужные методы.

Вместо callback-функций — callback-интерфейсы. Вместо полиморфизма засчёт вызова заранее-неизвестно-какой функции — вызов у заранее-неизвестного-какого объекта метода заранее известного интерфейса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 13:13

Хакер писал(а):Неправильная логика. В VB обладание адресом не даёт тебе возможность вызвать её. Оно даёт тебе просто бесполезное число (бесполезное без моего кирпича).

Да, действительно.. Не подумал про это.

Хакер писал(а):Тебе дают объект, олицетворяющий функцию.

Но ведь это не важно. Дают нечто, что можно в дальнейшем применить. А уж что там на самом деле - сишный указатель, джавоскриптовый объект или нетовский делегат по сути роли не играет.
И как из этого получится адрес для передачи в WinApi - тоже.

Хакер писал(а):А вообще: «ООП — наше всё». Поэтому, вместо указатель на функции надо использовать ссылки на интерфейсы, поддерживающие нужные методы.

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

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 13:31

Qwertiy писал(а):Ага, каждую однострочную функцию, используемую в одном месте, в отдельный класс и этот класс в отдельный файл.

И что, часто приходится однострочные фукнкции вызывать по указателю?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 15.10.2013 (Вт) 14:16

Хакер, есть ли более простой способ для запуска функций из моей DLL не из систем32, а из папки моего проекта?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как изменить путь к DLL?

Сообщение Mikle » 15.10.2013 (Вт) 14:57

Don Leno, а на чём написана твоя DLL?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 15:16

Хакер писал(а):И что, часто приходится однострочные фукнкции вызывать по указателю?

Очень даже. Всякие предикаты и ещё куча всего. В js вообще постоянно, в .NET'е в основном предикаты, обработчики событий, взаимодействие из потоков с формой. Заметь, в Си++ добавили лямбда-функции, чтобы даже функцию не выносить, а писать прям там где оно нужно. В джаве сейчас добавили лямбда-функции, ну и там есть возможность реализации интерфейса прямо в коде, где он передаётся; да и вложенные классы никто не запрещал. А вот недавно макросы на VBA делал - ужасно не хватало возможности попрередавать функции. Получилось какое-то нагромождение switch'ей по весьма странным штукам... А если распихать всё по файлам-классам и наделать интерфейсов, то вообще фиг что найдёшь. Даже подумывал прикрутить туда твой кирпич для функций, но что-то меня напугало другое объявление для новых VBA - помнишь, я тогда спрашивал?

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 16:14

Qwertiy писал(а):В js вообще постоянно, в .NET'е в основном предикаты

Ну, это какая-то массовая истерия. Это всё от шайтана.

Постоянно у наших разработчиков встречаю:
Код: Выделить всё
c = (function(x, y) { return x + y; })(a, b);

вместо
Код: Выделить всё
c = a + b;


Поубивалбы :x .

Qwertiy писал(а):Заметь, в Си++ добавили лямбда-функции, чтобы даже функцию не выносить

Ну, под давлением нового поколения дегенератов.

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

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

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 16:27

Хакер писал(а):
Код: Выделить всё
c = (function(x, y) { return x + y; })(a, b);

В таком виде конечно бред, но ведь только у функции есть область видимости переменных. Специфика языка...

Хакер писал(а):В итоге это приводит к тому, что сотни примерно одинаковых анонимных функций равномерно распределены по коду, хотя это могла бы быть одно унифицированная функция.

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

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

Re: Как изменить путь к DLL?

Сообщение Хакер » 15.10.2013 (Вт) 16:35

Qwertiy писал(а):Ключевое слово - примерно

Конечно, это и плохо.

Смысл в том, что ввести анонимную функцию психологически намного проще, чем ввести новую реальную (нормальную). Прежде чем завести полноценно-новую, человек подумает: а как назвать? А нет ли уже подобных? А надо ли вообще? А может быть поменять алгоритм?

Если человек будет загаживать глобальное пространство имён своими бестолковыми функциями, если остальные участники команды (если они есть) рано или поздно намекнут, что он не прав. Но с анонимными функциями подход другой — их вроде как не видно, они живут в «крепости» из родительской функции, и не проявляют себя.

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

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 17:01

Хакер писал(а):Конечно, это и плохо.

Почему если в 10 местах будет одинаковый for с одинаковым if'ом внутри, то это будет лучше, чем если в этих 10 местах вызовов where, first или ещё какого-нибудь фильтра, передав ему одинаковые лямбда-функции?
А если вынести функцию прверяющую условие, то таких окажется тьма, причём где-то в районе глобальной области - что хорошего? А если каждую из них поместить в класс, реализующий ICondition? А потом ещё поместить каждый такой класс в отдельный файлик?
Вынести весь цикл? А что от этого изменится? Та же функция на каждую отдельную проверку. И так же по одинаковому циклу, только теперь внутри функции. А если окажется, что циклы одинаковые только с точки зрения утиной типизации - то будет ещё веселее...
Не случайно же ввели отдельный синтаксис для однострочных лямбд - они как раз наиболее часто и встречаются...

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

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как изменить путь к DLL?

Сообщение Don Leno » 15.10.2013 (Вт) 17:59

Mikle писал(а):Don Leno, а на чём написана твоя DLL?

Написана на Visual Basicе

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.10.2013 (Вт) 18:02

Don Leno писал(а):Написана на Visual Basicе

Эээ.. Тут тоже что-то не так...

След.

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

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

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

    TopList