Страница: 1 |
Страница: 1 |
Вопрос: путь поиска DLL
Добавлено: 11.02.05 09:29
Автор вопроса: AlexT
Есть маленькая проблемка:
в runtime необходимо загрузить DLL, имя которой известно, а путь хранится в ячейке книги. Как это сделать? Если я в Declare указываю только имя - Dll не находится, даже если перед вызовом ее функций я к переменной окружения PATH добавляю ее путь...
Может где-то раньше обновлять PATH?...
ПС. Я тут посмотрел пример явного вызова dll на VB - уж слишком громоздко для маленькой задачки! и в добавок - у меня параметры процедуры разнотипные и есть строковые :(
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #1
Добавлено: 11.02.05 09:55
А что мешает указать полное имя (вместе с путём) в Declare?
Номер ответа: 2
Автор ответа:
AlexT
Вопросов: 1
Ответов: 4
Профиль | | #2
Добавлено: 11.02.05 10:20
дык я вроде бы написал... путь хранится в ячейке книги (то бишь он может быть изменен) - чтобы конечному пользователю не в исходном коде менять путь, а в ячейке на странице настройки
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 11.02.05 11:07
LoadLibrary
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 11.02.05 11:07
Если громоздко не нравится, то проверяй DIR$ и если её нет по APP.PATH, то копируй её туда.
Типа так:
[/code]
Declare Function MyProc Lib"MyLib" ...
If Len(Dir$(App.Path & "\MyLib.DLL))=0 Then
FileCopy ПутьВЯчейке, App.Path
End If
[code]
Только не нужно проверять каждый раз. Один раз проверь при запуске макроса.
PS: Я это не тестировал.
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 11.02.05 11:09
О, первый раз направильно теги написал
Declare Function MyProc Lib"MyLib" ...
If Len(Dir$(App.Path & "\MyLib.DLL))=0 Then
FileCopy ПутьВЯчейке, App.Path
End If
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 11.02.05 11:10
Дык не написал как раз, что путь может меняться.
Используй в таком случае LoadLibrary/GetProcAddress
Номер ответа: 7
Автор ответа:
AlexT
Вопросов: 1
Ответов: 4
Профиль | | #7
Добавлено: 11.02.05 12:27
если я в Declare указываю только имя - Dll не находится, даже если перед вызовом ее функций я к переменной окружения PATH добавляю ее путь...
только я это делал с помощью GetEnvironmentVariable и SetEnvironmentVariable
Номер ответа: 8
Автор ответа:
AlexT
Вопросов: 1
Ответов: 4
Профиль | | #8
Добавлено: 11.02.05 14:06
что-то у меня Dll по имени не находится, даже если она лежит в \System32. работает только с полным путем...
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 11.02.05 14:31
Хе, так может с этого и надо было начинать ))
А вообще-то неплохо было бы посмотреть, как объявляешь (Declare), как получаешь путь, в общем код. Если конечно это не государственноая тайна.
Номер ответа: 10
Автор ответа:
AlexT
Вопросов: 1
Ответов: 4
Профиль | | #10
Добавлено: 11.02.05 14:52
короче, с багом разобрался - в Винде была тандартная dll с таким же именем (полдня потерял...). Переименовал - и все заработало! С вариантом добавления нужного пути к переменной окружения PATH
Если нужна процедура проверки и добавления - предоставлю
Номер ответа: 11
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #11
Добавлено: 11.02.05 17:08
Если оно на время то можно временно скопировать в каталог Windows || System || System32 || в AppPath.
Можешь еще посмотреть CallApiByName(Ex)... Пусть немножко "громоздко" но да думаю что др. вариантов не так и много...