Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не подключается dll в dll / 25 сообщений из 26, страница 1 из 2
03.02.2020, 18:08
    #39921951
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Здравствуйте.
Проблема в следующем: есть dll которая подгружается динамически. Если использовать код:
Код: pascal
1.
DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));



и откомпилировать в *.exe, то он отрабатывает корректно и имеется ссылка на модуль библиотеке, если я этот же код компилирую в dll, то возвращается 0. Подскажите почему так может происходить?

это тестовый код для приложения, который работает:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button1Click(Sender: TObject);
type
 TOpenFunc =  function(strDBFileName : PWideChar;
                      nSensorType : LongInt;
                      nSensorBrAdjust : LongInt) : LongInt cdecl;
var
  DLLInstance : THandle;
  OpenFunc    : TOpenFunc;
  sPathWC     :WideChar;
  sPath, st: String;
  res: Integer;
begin
  DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));
  If DLLInstance = 0 Then ShowMessage('Не загружена!') else ShowMessage('Удача!');
end;




Это код из dll, который не находит загружаемую dll (getlasterror содержит 126):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function TMyClass.OpenFP(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
type
 TOpenFunc =  function(strDBFileName : PWideChar;
                      nSensorType : LongInt;
                      nSensorBrAdjust : LongInt) : LongInt cdecl;
var
  DLLInstance : THandle;
  OpenFunc    : TOpenFunc;
  sPath : String;
  res: Integer;
  S: AnsiString;
  W: WideString;
  P: PWideChar;
begin
  res := -777;
  DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));
  if DLLInstance=0 then
     MessageBox(0, PAnsiChar(IntToStr(DLLInstance)),'Отладка', MB_YESNO + MB_ICONQUESTION)
  Else
  Begin
    MessageBox(0, PAnsiChar(IntToStr(DLLInstance)),'Отладка', MB_YESNO + MB_ICONQUESTION);
    @OpenFunc := GetProcAddress(DLLInstance, 'sfem_Open');
    sPath := V8AsAString(@Params[1]);
    S := PAnsiChar(Pointer(sPath));
    W:=s;
    P :=PWideChar(W);
    if Assigned(@OpenFunc) then
      res   := OpenFunc(P, 5, 0)
    Else
      begin
        res := 777;
        MessageBox(0, PAnsiChar(IntToStr(GetLastError)),'Îòëàäêà', MB_YESNO + MB_ICONQUESTION)
      end;
  end;
  V8SetInt(RetValue, res);
  result := True;
end;
...
Рейтинг: 0 / 0
03.02.2020, 18:23
    #39921963
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Stept
Код: pascal
1.
2.
3.
  DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));
  if DLLInstance=0 then
     MessageBox(0, PAnsiChar(IntToStr(DLLInstance)),'Отладка ', MB_YESNO + MB_ICONQUESTION)


=>

Выведи лучше сообщение: SysErrorMessage(GetLastError)
...
Рейтинг: 0 / 0
03.02.2020, 18:45
    #39921984
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
ёёёёё,

Выводит "Не найден указанный модуль".
...
Рейтинг: 0 / 0
03.02.2020, 18:57
    #39921992
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Stept,

Добавь ещё проверку FileExists(), на всякий.
...
Что там у тебя за кодировка в имени модуля? А какую версию API в LoadLibrary() используешь - юникодную, или?
...
Рейтинг: 0 / 0
03.02.2020, 18:58
    #39921994
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
А где код, который загружает эту DLL?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.02.2020, 19:04
    #39921998
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Dimitry Sibiryakov,

Разве данный код

Код: pascal
1.
DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));

не загружает dll?
...
Рейтинг: 0 / 0
03.02.2020, 19:07
    #39922001
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Stept
"Не найден указанный модуль".
Если предположить, что битность у всех загружаемых модулей одна и та же, то тогда остается единственная причина: SFEMediator.dll использует другие dll и/или файлы, которые лежат в каталоге с
Stept
тестовым приложением, которое работает:
и их нет в каталоге приложения, которое запускает
Stept
dll, который не находит загружаемую dll
...
Рейтинг: 0 / 0
03.02.2020, 19:08
    #39922003
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
ёёёёё
А какую версию API в LoadLibrary() используешь - юникодную, или?
А какая разница? Если идет вызов
Stept
Код: pascal
1.
LoadLibrary(PChar(

...
Рейтинг: 0 / 0
03.02.2020, 19:11
    #39922008
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
_Vasilisk_,

Библиотеки 32 бита. В тестовом каталоге, так же как и в том где создается dll две доп библиотеки.
...
Рейтинг: 0 / 0
03.02.2020, 19:12
    #39922010
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Steptне загружает dll?

Повторяю медленно: где код, который загружает DLL в которой находится этот код?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.02.2020, 19:14
    #39922012
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Кстати если заменить

Код: pascal
1.
  DLLInstance := LoadLibrary(PChar('D:\VK\SFEMediator.dll'));


на
Код: pascal
1.
DLLInstance := LoadLibraryEx(PChar('D:\VK\SFEMediator.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);



то DLLInstance <> 0, но не находится функция в:

Код: pascal
1.
@OpenFunc := GetProcAddress(DLLInstance, 'sfem_Open');
...
Рейтинг: 0 / 0
03.02.2020, 19:15
    #39922013
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Stept
В тестовом каталоге, так же как и в том где создается dll две доп библиотеки.
Я спрашивал за каталоги откуда запускаются exe
...
Рейтинг: 0 / 0
03.02.2020, 19:17
    #39922014
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Stept
то DLLInstance <> 0,
Что и требовалось доказать. Сама dll находится, а выполнение DllMain обламывается

Stept
Код: pascal
1.
LOAD_LIBRARY_AS_DATAFILE);

...
но не находится функция в:
Что логично
...
Рейтинг: 0 / 0
03.02.2020, 19:18
    #39922016
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
_Vasilisk_
А какая разница? Если идет вызов

Я не уверен в правдивости ТС. Это он пишет, что в LoadLibrary строковый литерал, а в реальности что угодно может быть. Не верю я людям.
...
Рейтинг: 0 / 0
03.02.2020, 19:20
    #39922017
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
ёёёёё
Это он пишет, что в LoadLibrary строковый литерал, а в реальности что угодно может быть.
Он кастует это к PChar.
...
Рейтинг: 0 / 0
03.02.2020, 20:02
    #39922030
Stept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Скопировал файлы dll в каталог с exe все отработало корректно, не понимаю почему не используется путь явно указанный в LoadLibrary, а dll ищется в каталоге с exe...
...
Рейтинг: 0 / 0
03.02.2020, 20:16
    #39922032
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Потому что цепочка зависимостей не кончается на твоём вызове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.02.2020, 22:38
    #39922071
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
можно попробовать посмотреть Dependency Walker'ом. возможно как-то хитро зависимости не разрешаются
...
Рейтинг: 0 / 0
04.02.2020, 23:11
    #39922540
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Вангую - ДЛЛ ищется в каталоге рядом с exe, а не в папке с ДЛЛ-загрузчиком. Хотя если указаны абсолютные пути - не уверен. FileExists - и проверять, что там получилось.

P.S. Абсолютные пути типа X:\Y\z.dll - злое зло - переносимости никакой....
...
Рейтинг: 0 / 0
05.02.2020, 11:16
    #39922694
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
DarkMaster
P.S. Абсолютные пути типа X:\Y\z.dll - злое зло - переносимости никакой....

Относительные - не меньшее зло. Достаточно запустить прогу из другой currentdir, чтобы все поломалось. В идеале это абсолютный, получаемый относительно бинарника. Правда, при запуске через хардлинк будет облом
...
Рейтинг: 0 / 0
05.02.2020, 20:34
    #39923101
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Василий 2
DarkMaster
P.S. Абсолютные пути типа X:\Y\z.dll - злое зло - переносимости никакой....

Относительные - не меньшее зло. Достаточно запустить прогу из другой currentdir, чтобы все поломалось. В идеале это абсолютный, получаемый относительно бинарника. Правда, при запуске через хардлинк будет облом

Хардлинк - это, по-факту, копирование. Кто копирует только бинарник, а потом запускает - ссзб.
...
Рейтинг: 0 / 0
06.02.2020, 10:39
    #39923235
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
alekcvp
Хардлинк - это, по-факту, копирование.

Это, по факту, ссылка.
В nix среде, кстати, очень частый зверь. Правда, там и портабельный софт - редкость. Почему-то
...
Рейтинг: 0 / 0
06.02.2020, 11:09
    #39923263
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
Василий 2
alekcvp
Хардлинк - это, по-факту, копирование.

Это, по факту, ссылка.
В nix среде, кстати, очень частый зверь. Правда, там и портабельный софт - редкость. Почему-то

Ок, по-сути это копирование. Т.к. обычная ссылка перестаёт работать если удалить исходный файл, на который она ссылается. Хардлинк будет работать, пока не удалишь сам хардлинк.

В линуксе вообще полная **па с приложениями - приложение устанавливается только в те папки, в которые это задумано его автором, никакой гибкости, причём одно и то же приложение (например nginx) в одном дистрибутиве может быть установлено в /etc/nginx, в другом - куда-нибудь ещё, причём в первом свои данные оно будет хранить в /var/www, в другом - в /usr/www, в третьем - где-нибудь ещё. А самая мякотка в том, что узнать имена этих папок можно только их исходников или из гугла, т.к. чтобы посмотреть это в конфигах, надо знать где лежат сами конфиги, а они - см. выше.
...
Рейтинг: 0 / 0
06.02.2020, 11:23
    #39923273
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
alekcvp
Василий 2
пропущено...

Это, по факту, ссылка.
В nix среде, кстати, очень частый зверь. Правда, там и портабельный софт - редкость. Почему-то

Ок, по-сути это копирование. Т.к. обычная ссылка перестаёт работать если удалить исходный файл, на который она ссылается. Хардлинк будет работать, пока не удалишь сам хардлинк.

Хардлинк - это именно ссылка.
Отличие от обычной ссылки только в том что сам объект фактически удаляется только после того как на него не будет ни одного хардлинка. Ну и соответственно, возникает ограничение что хадлинки можно делать только в пределах одной файловой системы, иначе их не проконтролировать.
А так - ссылка и ссылка.
Зайди по любой ссылке, измени объект - и по любым ссылкам будет видно новое содержание.
Так что точно не копирование.
...
Рейтинг: 0 / 0
06.02.2020, 13:34
    #39923371
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не подключается dll в dll
alekcvpприложение устанавливается только в те папки, в которые это задумано его автором

Если автор правильный, то оно устанавливается туда, куда предписывает
https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не подключается dll в dll / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]