powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не подключается dll в dll
25 сообщений из 26, страница 1 из 2
Не подключается dll в dll
    #39921951
Stept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Проблема в следующем: есть 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
Не подключается dll в dll
    #39921963
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не подключается dll в dll
    #39921984
Stept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

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

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

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

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

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

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

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

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

Код: 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
Не подключается dll в dll
    #39922013
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stept
В тестовом каталоге, так же как и в том где создается dll две доп библиотеки.
Я спрашивал за каталоги откуда запускаются exe
...
Рейтинг: 0 / 0
Не подключается dll в dll
    #39922014
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stept
то DLLInstance <> 0,
Что и требовалось доказать. Сама dll находится, а выполнение DllMain обламывается

Stept
Код: pascal
1.
LOAD_LIBRARY_AS_DATAFILE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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