Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.10.20 14:40
Оценка:
Есть ли в каких-либо реализациях ЯП под винду возможность непосредственного (без промежуточной .LIB) импорта функций/данных из DLL?

В MSVC есть __declspec (dllimport), но оно только для оптимизации вызовов из DLL. Возможности непосредственно сослаться на определенную DLL там нет.
windows dll import direct
Re: Непосредственный импорт из DLL
От: Homunculus Россия  
Дата: 30.10.20 14:47
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Разумеется. Плагины так работают, например. Ты ж их без линковки рантаймом подключаешь.
Re: Непосредственный импорт из DLL
От: Danchik Украина  
Дата: 30.10.20 15:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в каких-либо реализациях ЯП под винду возможность непосредственного (без промежуточной .LIB) импорта функций/данных из DLL?


ЕМ>В MSVC есть __declspec (dllimport), но оно только для оптимизации вызовов из DLL. Возможности непосредственно сослаться на определенную DLL там нет.


Конечно, странный вопрос. LoadLibrary, GetProcAddress никто не отменял.
Для C# прямо в язык встроено https://docs.microsoft.com/en-us/dotnet/framework/interop/consuming-unmanaged-dll-functions
Re[2]: Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.10.20 15:48
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Плагины так работают, например. Ты ж их без линковки рантаймом подключаешь.


Это не импорт, а динамическое связывание.
Re[2]: Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.10.20 15:49
Оценка:
Здравствуйте, Danchik, Вы писали:

D>LoadLibrary, GetProcAddress никто не отменял.


Это не импорт.

D>Для C# прямо в язык встроено https://docs.microsoft.com/en-us/dotnet/framework/interop/consuming-unmanaged-dll-functions


Оно генерит статический импорт?
Re: Непосредственный импорт из DLL
От: Jack128  
Дата: 30.10.20 16:10
Оценка: 21 (1) +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в каких-либо реализациях ЯП под винду возможность непосредственного (без промежуточной .LIB) импорта функций/данных из DLL?


ЕМ>В MSVC есть __declspec (dllimport), но оно только для оптимизации вызовов из DLL. Возможности непосредственно сослаться на определенную DLL там нет.


Например в дельфи:

function CreateFile(lpFileName: LPCWSTR; dwDesiredAccess, dwShareMode: DWORD;
  lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD;
  hTemplateFile: THandle): THandle; stdcall; external "kernel32.dll" name 'CreateFileW';
Re: Непосредственный импорт из DLL
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.10.20 07:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в каких-либо реализациях ЯП под винду возможность непосредственного (без промежуточной .LIB) импорта функций/данных из DLL?


Линкер от gcc умеет линковаться непосредственно с .dll, без вспомогательной .lib

Но дело в том, что .dll не оптимизирована для быстрого поиска символов по ней, поэтому без впомогательной .lib линковка работает ощутимо медленнее.
Re[2]: Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.10.20 07:43
Оценка:
Здравствуйте, Jack128, Вы писали:

J>
J>function CreateFile(lpFileName: LPCWSTR; dwDesiredAccess, dwShareMode: DWORD;
J>  lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD;
J>  hTemplateFile: THandle): THandle; stdcall; external "kernel32.dll" name 'CreateFileW';
J>


Мощная фича. В C/C++ до такого не додумались, а давно бы надо.
Re[2]: Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.10.20 09:52
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>.dll не оптимизирована для быстрого поиска символов по ней, поэтому без впомогательной .lib линковка работает ощутимо медленнее.


Ощутимо — это на сколько микросекунд на сотню импортов?
Re[3]: Непосредственный импорт из DLL
От: Danchik Украина  
Дата: 01.11.20 12:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Danchik, Вы писали:


D>>LoadLibrary, GetProcAddress никто не отменял.


ЕМ>Это не импорт.


А что же это тогда?

D>>Для C# прямо в язык встроено https://docs.microsoft.com/en-us/dotnet/framework/interop/consuming-unmanaged-dll-functions


ЕМ>Оно генерит статический импорт?


Ну по вашей терминологии то да
Re[4]: Непосредственный импорт из DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.11.20 14:53
Оценка:
Здравствуйте, Danchik, Вы писали:

D>>>LoadLibrary, GetProcAddress никто не отменял.


ЕМ>>Это не импорт.


D>А что же это тогда?


Динамическое связывание, вестимо.
Re: Непосредственный импорт из DLL
От: flаt  
Дата: 02.11.20 11:35
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в каких-либо реализациях ЯП под винду возможность непосредственного (без промежуточной .LIB) импорта функций/данных из DLL?


Есть.

Delphi, например. В Rust хотят сделать так же (https://github.com/rust-lang/rust/issues/58713).

Мне кажется, в линкере unilink есть поддержка этого, но могу ошибаться (https://wiki.dlang.org/Linking_With_Unilink)
Re[2]: Непосредственный импорт из DLL
От: flаt  
Дата: 02.11.20 11:37
Оценка: +1
Здравствуйте, Pzz, Вы писали:



Pzz>Линкер от gcc умеет линковаться непосредственно с .dll, без вспомогательной .lib


Pzz>Но дело в том, что .dll не оптимизирована для быстрого поиска символов по ней, поэтому без впомогательной .lib линковка работает ощутимо медленнее.


Что имеется ввиду здесь? Какая связь между наличием .lib и таблицей импорта PE?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.