информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 700 с лишним git-серверов пострадало... 
 От повторного пришествия Шаи-Хулуда... 
 Крупный сбой Azure и других сервисов... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[MSVC] .DLL -> .LIB 18.11.01 12:18  Число просмотров: 826
Автор: :-) <:-)> Статус: Elderman
Отредактировано 18.11.01 12:24  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> poslushaj, ya tak i ne ponyal, na fig tebe "pryamye" imena
> ????
> esli ty vsju etu fignju bidesh' v C++ ispol'zovat', to
> kakogo figa bespokoitsya ???

Что же тут непонятного? :-)
Я использую ф-ю WsControl из wsock32.dll. Она нелокументированная, и в стандартном wsock32.lib ее нет. Через GetProcAddress() ее доставать неохота, хочеца создать свой либ с этой функцией. А у нее имя прямое :-))
<programming>
[MSVC] .DLL -> .LIB 11.11.01 19:59  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Как в MSVC из .DLL сделать .LIB, чтобы юзать ф-ии из этой DLL ?
(через LoadLibrary/GetProcAddress не охота)
Например, мне нужна ф-я WsControl из wsock32.dll

Объявлена она у меня так:
extern "C" int WINAPI WsControl(DWORD protocol,
DWORD action, LPVOID pRequestInfo,
LPDWORD pcbRequestInfoLen,
LPVOID pResponseInfo,
LPDWORD pcbResponseInfoLen);

Cоздал файл wsock32.def следующего содержания:
;---
LIBRARY WSOCK32
EXPORTS
WsControl
;---

и сделал свою либу командой:
lib /def:wsock32.def

Но при линковке с моей lib выдается ошибка:
error LNK2001: unresolved external symbol _WsControl@24
Так как ф-я объявлена с модификатором __stdcall, линкер ищет искаженное имя _WsControl@24, а в lib оно не искаженное - просто WsControl.
Если ф-ю объявить как __cdecl или написать в wsock32.def искаженное имя:
EXPORTS
WsControl@24
то программа cлинкуется, но по понятным причинам не будет работать.

Очевидно, что можно сделать свою wsock32.dll, объявить в ней WsControl, и при ее компиляции создастся нормальный lib.

Но неужели в MSVC нет простого способа, чтобы из DLL сразу сделать LIB?
В BC++ например это делается одной командой:
implib wsock.llb wsock32.dll
[MSVC] .DLL -> .LIB 16.11.01 04:45  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> Как в MSVC из .DLL сделать .LIB, чтобы юзать ф-ии из этой
> DLL ?
> (через LoadLibrary/GetProcAddress не охота)
> Например, мне нужна ф-я WsControl из wsock32.dll
>
> Объявлена она у меня так:
> extern "C" int WINAPI WsControl(DWORD protocol,
> DWORD action, LPVOID pRequestInfo,
> LPDWORD pcbRequestInfoLen,
> LPVOID pResponseInfo,
> LPDWORD pcbResponseInfoLen);
>
> Cоздал файл wsock32.def следующего содержания:
> ;---
> LIBRARY WSOCK32
> EXPORTS
> WsControl
> ;---
>
> и сделал свою либу командой:
> lib /def:wsock32.def
Na skol'ko ya znayu vsyakakashkaimenno v etom.

tebe ne stoit sozdavat' wsock32.def. Pri sozdanii etogo file-a, tebe obyazatel'no nado vyzyvat' LoadLibrary, no sleduet delat' po drugomu :
__declspec(export) ... i prochaya fignya (sejchas v sintaksise ne uveren :-))) ). eto tebe sgenerit wsock32.lib file. nu a potom vse kak obychno :-)

>
> Но при линковке с моей lib выдается ошибка:
> error LNK2001: unresolved external symbol _WsControl@24
> Так как ф-я объявлена с модификатором __stdcall, линкер
> ищет искаженное имя _WsControl@24, а в lib оно не
> искаженное - просто WsControl.
> Если ф-ю объявить как __cdecl или написать в wsock32.def
> искаженное имя:
> EXPORTS
> WsControl@24
> то программа cлинкуется, но по понятным причинам не будет
> работать.
>
> Очевидно, что можно сделать свою wsock32.dll, объявить в
> ней WsControl, и при ее компиляции создастся нормальный
> lib.
>
> Но неужели в MSVC нет простого способа, чтобы из DLL сразу
> сделать LIB?
> В BC++ например это делается одной командой:
> implib wsock.llb wsock32.dll
[MSVC] .DLL -> .LIB 16.11.01 22:22  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > и сделал свою либу командой:
> > lib /def:wsock32.def
> Na skol'ko ya znayu vsyakakashkaimenno v etom.
>
> tebe ne stoit sozdavat' wsock32.def. Pri sozdanii etogo
> file-a, tebe obyazatel'no nado vyzyvat' LoadLibrary, no
> sleduet delat' po drugomu :
> __declspec(export) ... i prochaya fignya (sejchas v
> sintaksise ne uveren :-))) ). eto tebe sgenerit wsock32.lib
> file. nu a potom vse kak obychno :-)

Это-то понятно, я же писал:
> >
> > Очевидно, что можно сделать свою wsock32.dll, объявить в
> > ней WsControl, и при ее компиляции создастся
>> нормальный lib.

Понятное дело, что можно создать такую пустышку wsock32.cpp:

// ------- wsock32.cpp
#include <windows.h>

extern "C" __declspec(dllexport)
int WINAPI WsControl(DWORD protocol,
DWORD action, LPVOID pRequestInfo,
LPDWORD pcbRequestInfoLen,
LPVOID pResponseInfo,
LPDWORD pcbResponseInfoLen)
{
return 0;
}
// ------- EOF

И при ее компиляции сгенерится wsock32.lib.
Но все равно без DEF-файла тут не обойтись, пототому что при экспорте с помощью __declspec(dllexport) генерится mangled name (а в виндусовом wsock32.dll оно WsControl - не mangled)
Зато экспорт через DEF-файл - не искажает имен (или можно заставить __declspec(dllexport) не декорировать имена ?)
Вот что показывает dumpbin для этих двух случаев:

Экспорт ф-ии WsControl() с помощью __declspec(dllexport):
// compiled with:
// cl wsock32.cpp /link /dll /out:wsock32.dll /noentry

DLL name : wsock32.dll
Symbol name : _WsControl@24
Name type : name <-------------- !!!!!
Hint : 0
Name : _WsControl@24 <----- !!!!!

Экспорт ф-ии WsControl() через DEF-файл:
// compiled with:
// cl wsock32.cpp /link /dll /out:wsock32.dll /noentry /def:wsock32.def
// OR
// cl wsock32.cpp /link /dll /out:wsock32.dll /noentry /export:WsControl

DLL name : wsock32.dll
Symbol name : _WsControl@24
Name type : undecorate <-------- !!!!!
Hint : 0
Name : WsControl <--------- !!!!!


Но меня интереовал более легкий способ создания .LIB файлов из имеющихся .DLL
(чтобы не создавать wsock32.cpp)
Я нашел вот такой способ:
; --- wsock32.def
LIBRARY WSOCK32
EXPORTS
WsControl@24 @1001
; ---
lib /def:wsock32.def
Создается wsock32.lib, но при линковке с ним в получившемся экзешнике WsControl() импортируется только по ординалу 1001.
А если я хочу импортировать WsControl по имени, то надо создавать .lib обычным способом (городить огород с wsock32.cpp и wsock32.def)
Как у M$ все запущено :-( У Борланда это одной командой делается...
А может я зря M$ ругаю и еще какие-нибудь способы есть?

И еще вопрос: как экспортировать ф-ю из DLLтолькопо ординалу?
[MSVC] .DLL -> .LIB 16.11.01 23:58  
Автор: kabanchik Статус: Незарегистрированный пользователь
Отредактировано 17.11.01 00:05  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> > > и сделал свою либу командой:
> > > lib /def:wsock32.def
> > Na skol'ko ya znayu vsyakakashkaimenno v etom.
> >
> > tebe ne stoit sozdavat' wsock32.def. Pri sozdanii
> etogo
> > file-a, tebe obyazatel'no nado vyzyvat' LoadLibrary,
> no
> > sleduet delat' po drugomu :
> > __declspec(export) ... i prochaya fignya (sejchas v
> > sintaksise ne uveren :-))) ). eto tebe sgenerit
> wsock32.lib
> > file. nu a potom vse kak obychno :-)
>
> Это-то понятно, я же писал:
> > >
> > > Очевидно, что можно сделать свою wsock32.dll,
> объявить в
> > > ней WsControl, и при ее компиляции создастся
> >> нормальный lib.
>
> Понятное дело, что можно создать такую пустышку
> wsock32.cpp:
>
> // ------- wsock32.cpp
> #include <windows.h>
>
> extern "C" __declspec(dllexport)
> int WINAPI WsControl(DWORD protocol,
> DWORD action, LPVOID pRequestInfo,
> LPDWORD pcbRequestInfoLen,
> LPVOID pResponseInfo,
> LPDWORD pcbResponseInfoLen)
> {
> return 0;
> }
> // ------- EOF
>
> И при ее компиляции сгенерится wsock32.lib.
> Но все равно без DEF-файла тут не обойтись, пототому что
> при экспорте с помощью __declspec(dllexport) генерится
> mangled name (а в виндусовом wsock32.dll оно WsControl - не
> mangled)
> Зато экспорт через DEF-файл - не искажает имен (или можно
> заставить __declspec(dllexport) не декорировать имена ?)
> Вот что показывает dumpbin для этих двух случаев:
>
> Экспорт ф-ии WsControl() с помощью __declspec(dllexport):
> // compiled with:
> // cl wsock32.cpp /link /dll /out:wsock32.dll /noentry
>
> DLL name : wsock32.dll
> Symbol name : _WsControl@24
> Name type : name <-------------- !!!!!
> Hint : 0
> Name : _WsControl@24 <----- !!!!!
>
> Экспорт ф-ии WsControl() через DEF-файл:
> // compiled with:
> // cl wsock32.cpp /link /dll /out:wsock32.dll /noentry
> /def:wsock32.def
> // OR
> // cl wsock32.cpp /link /dll /out:wsock32.dll /noentry
> /export:WsControl
>
> DLL name : wsock32.dll
> Symbol name : _WsControl@24
> Name type : undecorate <-------- !!!!!
> Hint : 0
> Name : WsControl <--------- !!!!!
>
>
> Но меня интереовал более легкий способ создания .LIB файлов
> из имеющихся .DLL
> (чтобы не создавать wsock32.cpp)
> Я нашел вот такой способ:
> ; --- wsock32.def
> LIBRARY WSOCK32
> EXPORTS
> WsControl@24 @1001
> ; ---
> lib /def:wsock32.def
> Создается wsock32.lib, но при линковке с ним в получившемся
> экзешнике WsControl() импортируется только по ординалу
> 1001.
> А если я хочу импортировать WsControl по имени, то надо
> создавать .lib обычным способом (городить огород с
> wsock32.cpp и wsock32.def)
> Как у M$ все запущено :-( У Борланда это одной командой
> делается...
> А может я зря M$ ругаю и еще какие-нибудь способы есть?
>
> И еще вопрос: как экспортировать ф-ю из DLLтолькопо
> ординалу?

ya ispol'zoval DLL tak :
esli deklariju - __declspec(dllexport) , to .DEF file ne igraet roli. t.e. mne dostatochno prosto vkljuchit' v project "wsock32.lib", i on avtomatom podymet "wsock32.dll". dal'she menya nichego ne interesuet.
kstati, esli dazhe ispol'zuju .DEF file, to vse ravno v VC++ rabotaet.
Bylo dazhe takoe :
pisal .DLL on ne podymalsya v Oracle, t.k. ya generil .LIB file. kogda zapreshal generit' .LIB, to ljubaja programma podymala ego.

a chtoby ispol'zovat' f-ii v tvoem .EXE, nuzhno vkljuchat' f-ii takim obrazom :
__declspec(dllimport) :

extern "C" __declspec(dllimport)
int WINAPI WsControl(DWORD protocol,
DWORD action, LPVOID pRequestInfo,
LPDWORD pcbRequestInfoLen,
LPVOID pResponseInfo,
LPDWORD pcbResponseInfoLen)
{
}


kstati, ya postoyanno putayu gde nado dllexport , a gde dllimport :-))) tak chto esli chto ne poluchitsya, to pomenyaj ix mestami :-)))))
dlja etogo konechno luchshe napisat' MACROS raz i navsegda, naprimer :

#ifPRODUCE_DLL
#define FUNCTION __declspec(dllexport)
#else
#define FUNCTION __declspec(dllimport)
#endif

dalee uzhe ponyatno :
FUNCTION int WINAPI SomeShit();

esli .LIB generitsya, to problem u tebyanikakixne dolzhno byt'. i GetProcAddress() tebe voobshe ne nuzhen budet

udachi.


ЗЫ ne v temu. russkie bukvy vidny ???

не в тему ---- это тест !

[MSVC] .DLL -> .LIB 17.11.01 04:09  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> a chtoby ispol'zovat' f-ii v tvoem .EXE, nuzhno vkljuchat'
> f-ii takim obrazom :
> __declspec(dllimport) :
>
> extern "C" __declspec(dllimport)
> int WINAPI WsControl(DWORD protocol,
> DWORD action, LPVOID pRequestInfo,
> LPDWORD pcbRequestInfoLen,
> LPVOID pResponseInfo,
> LPDWORD pcbResponseInfoLen)
> {
> }

> #ifPRODUCE_DLL
> #define FUNCTION __declspec(dllexport)

> #else
> #define FUNCTION __declspec(dllimport)
> #endif
>
> dalee uzhe ponyatno :
> FUNCTION int WINAPI SomeShit();

в макросе ты забыл extern"C"
а это основное почему будут или не будут кривыми имена

в h-файле удобно сделать так (как обычно и делают) :

#ifdef __cplusplus
extern"C"
{
#endif

// содержимое файла

#ifdef __cplusplus
}
#endif

p.s.
> ЗЫ ne v temu. russkie bukvy vidny ???
>
> не в тему ---- это тест !
>
видны :)
[MSVC] .DLL -> .LIB 17.11.01 14:14  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > a chtoby ispol'zovat' f-ii v tvoem .EXE, nuzhno
> vkljuchat'
> > f-ii takim obrazom :
> > __declspec(dllimport) :
> >
> > extern "C" __declspec(dllimport)
> > int WINAPI WsControl(DWORD protocol,
> > DWORD action, LPVOID pRequestInfo,
> > LPDWORD pcbRequestInfoLen,
> > LPVOID pResponseInfo,
> > LPDWORD pcbResponseInfoLen)
> > {
> > }
>
> > #ifPRODUCE_DLL
> > #define FUNCTION __declspec(dllexport)
> > #else
> > #define FUNCTION __declspec(dllimport)
> > #endif
> >
> > dalee uzhe ponyatno :
> > FUNCTION int WINAPI SomeShit();
>

> в макросе ты забыл extern"C"
> а это основное почему будут или не будут кривыми имена
>
> в h-файле удобно сделать так (как обычно и делают) :
>
> #ifdef __cplusplus
> extern"C"
> {
> #endif
>
> // содержимое файла
>
> #ifdef __cplusplus
> }
> #endif
>

Даже если поставить extern "C", а ф-я объявлена как _stdcall, то имя у нее все равно будет кривое (напр. WsControl@24, т.е. добавляется подчеркивание и кол-во байт на стеке). А с _cdecl все нормально. Поэтому если хотим экспортировать не кривое имя, надо пользоваться .DEF-файлом или ключом /export в командной строке линкера.
[MSVC] .DLL -> .LIB 17.11.01 23:03  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
poslushaj, ya tak i ne ponyal, na fig tebe "pryamye" imena ????
esli ty vsju etu fignju bidesh' v C++ ispol'zovat', to kakogo figa bespokoitsya ???
[MSVC] .DLL -> .LIB 18.11.01 12:18  
Автор: :-) <:-)> Статус: Elderman
Отредактировано 18.11.01 12:24  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> poslushaj, ya tak i ne ponyal, na fig tebe "pryamye" imena
> ????
> esli ty vsju etu fignju bidesh' v C++ ispol'zovat', to
> kakogo figa bespokoitsya ???

Что же тут непонятного? :-)
Я использую ф-ю WsControl из wsock32.dll. Она нелокументированная, и в стандартном wsock32.lib ее нет. Через GetProcAddress() ее доставать неохота, хочеца создать свой либ с этой функцией. А у нее имя прямое :-))
[MSVC] .DLL -> .LIB 18.11.01 18:25  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> Я использую ф-ю WsControl из wsock32.dll. Она
> нелокументированная, и в стандартном wsock32.lib ее нет.
> Через GetProcAddress() ее доставать неохота, хочеца
> создать свой либ с этой функцией. А у нее имя прямое :-))

oh nu da ... chto to ya tormozhu :-)))
interestnaya fignja ...
tut vot drugoj variant, tozhe pravda krivoj :-)))) no esli tebja vozvrashaemoe znachenie ne volnuet, to mozhet stoit poprobovat' takim makarom, ili zhe prosto napishi svoju f-uju, naprimer MyWsControl ...

typedef int (*FuncWsControl)(DWORD, DWORD, LPVOID , LPDWORD, LPVOID LPDWORD );
FuncWsControl g_lpFuncWsControl = NULL;
HMODULE hWsocket32 = NULL;

#define  WsControl(protocol, action, pRequestInfo, pcbRequestInfoLen, pResponseInfo, pcbResponseInfoLen)    \
if (g_lpFuncWsControl == NULL)              \
{                                                                \
    if (hWsocket32 == NULL)                     \
        hWsocket32 = ::LoadLibrary(....);    \
    g_lpFuncWsContro  =::GetProcAddress(hWsocket, "WsControl");     \
}                                                               \
*g_lpFuncWsControl(protocol, action, pRequestInfo, pcbRequestInfoLen, pResponseInfo, pcbResponseInfoLen);


---

ya ponimaju, eto ne graciozno, no sojdet :-)))

po moemu prosto naprosto net varianta bez GetProcAddress dokopatsya do f-ii. v krajnem sluchae poprobuj cherez
__decspec(dllexport) - mozhet rebyata iz MS sdelali dobroe delo, ostavili f-iju v LIB-e :-)))
da i na fig, zrya poprostu vremya teryat' - vse genial'noe dolzhno byt' prosto. usaj tradicionnymi metodami i vse :-)))

udachi.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach