Как передать dll-ке Environ$?

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

Как передать dll-ке Environ$?

Сообщение kibernetics » 16.06.2009 (Вт) 12:29

Народ, всем привет.
Скажите, у меня есть сторонняя длл-ка, объявляется примерно так:
Код: Выделить всё
Declare Function SetProperties Lib "C:\Мои документы\user\propertylib" (ByVal nPropertyID As Long, ByRef pParams As Any) As Long


однако, часть компов сидит на терминалке, и путь нужно получить через Environ.
Если же делаю:
Код: Выделить всё
Declare Function SetProperties Lib Environ("%userprofile%") & "propertylib" (ByVal nPropertyID As Long, ByRef pParams As Any) As Long

то возникает ошибка, мол:
Excepted: string constant

как можно объявить функцию с переменной окружения?

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

Re: Как передать dll-ке Environ$?

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

Штатными средствами — никак. Но вообще это можно сделать определённым способом. Для меня это довольно простой способ. Каким он покажется тебе, не знаю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как передать dll-ке Environ$?

Сообщение kibernetics » 16.06.2009 (Вт) 13:34

Хакер писал(а):Штатными средствами — никак. Но вообще это можно сделать определённым способом. Для меня это довольно простой способ. Каким он покажется тебе, не знаю.

Ура! Попрошу поделиться любым способом. Так мне проще будет понять насколько способ прост для меня.

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

Re: Как передать dll-ке Environ$?

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

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

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

Re: Как передать dll-ке Environ$?

Сообщение alibek » 16.06.2009 (Вт) 13:54

Указывай без пути.
А путь указывай в переменной Path (с помощью SetEnvironmentVariable).
Lasciate ogni speranza, voi ch'entrate.

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

Re: Как передать dll-ке Environ$?

Сообщение arthur2 » 16.06.2009 (Вт) 14:09

Код: Выделить всё
Option Explicit
Declare Function myFunction Lib "Test.DLL" () As Long

Function myFun() As Long'
    On Error Resume Next
    ChDrive "C:"        ' Устанавливаем нужный
    ChDir "C:\MyApp"    ' каталог текущим
    myFun = myFunction() 
    If Err.Number Then
      MsgBox "Файл Test.DLL не найден"
    Else
     'код выполнился
    End If
End Function
Артур
 
   

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

Re: Как передать dll-ке Environ$?

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

Вообще-то последние два предложенных варианта несколько опасны.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Как передать dll-ке Environ$?

Сообщение karlex » 17.06.2009 (Ср) 7:41

А разве нельзя через LoadLibrary? :roll:
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

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

Re: Как передать dll-ке Environ$?

Сообщение Хакер » 17.06.2009 (Ср) 7:44

Что через LoadLibrary?

По твоему вызов функции, объявленной через Declare, не использует LoadLibrary?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Как передать dll-ке Environ$?

Сообщение karlex » 17.06.2009 (Ср) 8:15

Через LoadLibrary загрузить библиотеку.
По моему как раз Declare -- абстракция, над LoadLibrary.
Просто это, вроде как, обычный способ, вот я и подумал зачем как-то извращаться.
Хотя... Вызов функции, наверно, будет затруднителен. Каюсь, поторопился.

Тогда интересно узнать подробности твоего способа.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

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

Re: Как передать dll-ке Environ$?

Сообщение alibek » 17.06.2009 (Ср) 8:26

karlex писал(а):Тогда интересно узнать подробности твоего способа.

Какие еще подробности нужны, кроме сказанных? Как именно перехватить вызов функции?
Lasciate ogni speranza, voi ch'entrate.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Как передать dll-ке Environ$?

Сообщение karlex » 17.06.2009 (Ср) 8:46

А, ну если основная сложность только в перехвате...
Понятно, пойду разбираться в перехвате, ни когда раньше не приходилось этим заниматься.

Добавлено:
Хотя, я бы не отказался от какой-нибудь информации о DllFunctionCall, например, какие параметры она принимает?
Найти ни чего не удалось, как правило информация о том, что она "тяжелая".
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

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

Re: Как передать dll-ке Environ$?

Сообщение arthur2 » 17.06.2009 (Ср) 13:37

Хакер писал(а):Вообще-то последние два предложенных варианта несколько опасны.

А чем именно?
Артур
 
   

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

Re: Как передать dll-ке Environ$?

Сообщение Хакер » 17.06.2009 (Ср) 13:45

Тем, что система будет в последнюю очередь искать библиотеку в местах, указанных в PATH, и во вторую очередь в текущей директории. Если она встретит другую библиотеку с аналогичным именем файла раньше, чем заглянет в текущую директорию (или в PATH), то будет ошибка. Причина которой, однако, может оказаться не такой уж очевидной.
—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: Как передать dll-ке Environ$?

Сообщение arthur2 » 17.06.2009 (Ср) 14:03

Понятно :) А в какой последовательности она вообще просматривает пути?
Артур
 
   

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

Re: Как передать dll-ке Environ$?

Сообщение Хакер » 17.06.2009 (Ср) 14:05

Помоему в таком:

1) App.Path
2) CurDir
3) system32
4) system
5) Пути из PATH
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Как передать dll-ке Environ$?

Сообщение iGrok » 17.06.2009 (Ср) 14:14

Хакер писал(а):Помоему в таком:

1) App.Path
2) CurDir
3) system32
4) system
5) Пути из PATH

Там ещё есть пара нюансов, как говорит мсдн:
http://msdn.microsoft.com/en-us/library/ms682586.aspx

О. И если я правильно понял, вот это:
http://msdn.microsoft.com/en-us/library/ms686203.aspx
может помочь.
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: Google-бот и гости: 72

    TopList