Как линковать DLL c __stdcall без манглирования
От: nnye  
Дата: 13.01.03 13:41
Оценка:
Всем здравствуйте!
Есть dll — она экспортирует функции (имена без манглирования как в WinAPI) Соглашение о вызове — тоже __stdcall.
Вопрос — как залинковать библиотеку к файлу?
// линкует, но рушит стек, т.к. __cdecl
extern "C" double f(double, double);

// не может линкануть, т.к. имя __imp_?f@@YGNNN@Z
__declspec(dllimport) double __stdcall f(double, double);

// не может линкануть, т.к. имя _wspUPT@16 
extern "C" double __stdcall f(double, double);   
   // Такой способ используется в заголовках windows sdk. 
   // Как избавиться от размера передаваемых аргументов на 
   // конце? может есть какая-то спец опция компилятора?

Помогите, плз, кто может!!!

13.01.03 17:03: Перенесено модератором из 'C/C++' в "Средства разработки" — ПК
Re: Как линковать DLL c __stdcall без манглирования
От: Valerio Россия linkedin.com/in/boronin
Дата: 13.01.03 14:05
Оценка:
добавь .def file такого типа:

EXPORTS
f PRIVATE

и радуйся жизни!

N>Всем здравствуйте!

N>Есть dll — она экспортирует функции (имена без манглирования как в WinAPI) Соглашение о вызове — тоже __stdcall.
N>Вопрос — как залинковать библиотеку к файлу?
N>
N>// линкует, но рушит стек, т.к. __cdecl
N>extern "C" double f(double, double);

N>// не может линкануть, т.к. имя __imp_?f@@YGNNN@Z
N>__declspec(dllimport) double __stdcall f(double, double);

N>// не может линкануть, т.к. имя _wspUPT@16 
N>extern "C" double __stdcall f(double, double);   
N>   // Такой способ используется в заголовках windows sdk. 
N>   // Как избавиться от размера передаваемых аргументов на 
N>   // конце? может есть какая-то спец опция компилятора?
N>

N>Помогите, плз, кто может!!!
... << RSDN@Home 1.0 beta 4 >> silent
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: Как линковать DLL c __stdcall без манглирования
От: kmn Украина  
Дата: 13.01.03 14:13
Оценка:
Здравствуйте, nnye, Вы писали:

N>Всем здравствуйте!

N>Есть dll — она экспортирует функции (имена без манглирования как в WinAPI) Соглашение о вызове — тоже __stdcall.
N>Вопрос — как залинковать библиотеку к файлу?
N>
N>// линкует, но рушит стек, т.к. __cdecl
N>extern "C" double f(double, double);

N>// не может линкануть, т.к. имя __imp_?f@@YGNNN@Z
N>__declspec(dllimport) double __stdcall f(double, double);

N>// не может линкануть, т.к. имя _wspUPT@16 
N>extern "C" double __stdcall f(double, double);   
N>   // Такой способ используется в заголовках windows sdk. 
N>   // Как избавиться от размера передаваемых аргументов на 
N>   // конце? может есть какая-то спец опция компилятора?
N>

N>Помогите, плз, кто может!!!


Попробуй так:
extern "C" __declspec(dllimport) double __stdcall f(double, double);


хотя третий вариант должен работать
Re[2]: Как линковать DLL c __stdcall без манглирования
От: nnye  
Дата: 13.01.03 15:11
Оценка:
Здравствуйте, Valerio, Вы писали:

V>добавь .def file такого типа:


V>EXPORTS

V> f PRIVATE

V>и радуйся жизни!


N>>Всем здравствуйте!

N>>Есть dll — она экспортирует функции (имена без манглирования как в WinAPI) Соглашение о вызове — тоже __stdcall.
N>>Вопрос — как залинковать библиотеку к файлу?
N>>
N>>// линкует, но рушит стек, т.к. __cdecl
N>>extern "C" double f(double, double);

N>>// не может линкануть, т.к. имя __imp_?f@@YGNNN@Z
N>>__declspec(dllimport) double __stdcall f(double, double);

N>>// не может линкануть, т.к. имя _wspUPT@16 
N>>extern "C" double __stdcall f(double, double);   
N>>   // Такой способ используется в заголовках windows sdk. 
N>>   // Как избавиться от размера передаваемых аргументов на 
N>>   // конце? может есть какая-то спец опция компилятора?
N>>

N>>Помогите, плз, кто может!!!

V>


К сожалению такой вариант не работает...
Единственое решение, которое я нашел, — линковать по ординалу — но это плохо, поскольку в другой версии длл ордииналы могут поменяться
Re[2]: Как линковать DLL c __stdcall без манглирования
От: nnye  
Дата: 13.01.03 15:16
Оценка:
Здравствуйте, kmn, Вы писали:

kmn>Здравствуйте, nnye, Вы писали:


N>>Всем здравствуйте!

N>>Есть dll — она экспортирует функции (имена без манглирования как в WinAPI) Соглашение о вызове — тоже __stdcall.
N>>Вопрос — как залинковать библиотеку к файлу?
N>>
N>>// линкует, но рушит стек, т.к. __cdecl
N>>extern "C" double f(double, double);

N>>// не может линкануть, т.к. имя __imp_?f@@YGNNN@Z
N>>__declspec(dllimport) double __stdcall f(double, double);

N>>// не может линкануть, т.к. имя _wspUPT@16 
N>>extern "C" double __stdcall f(double, double);   
N>>   // Такой способ используется в заголовках windows sdk. 
N>>   // Как избавиться от размера передаваемых аргументов на 
N>>   // конце? может есть какая-то спец опция компилятора?
N>>

N>>Помогите, плз, кто может!!!

kmn>

kmn>Попробуй так:
kmn>
kmn>extern "C" __declspec(dllimport) double __stdcall f(double, double);
kmn>


kmn>хотя третий вариант должен работать

Тоже пробовал — не работает (я его не включил сразу как очевидный, поскольку dllimport добавляет к имени __imp__)
Единственое решение, которое я нашел, — линковать по ординалу — но это плохо, поскольку в другой версии длл ордииналы могут поменяться
Re: Как линковать DLL c __stdcall без манглирования
От: ua1zcl Россия www.alexklm.ru
Дата: 14.01.03 00:59
Оценка:
Здравствуйте, nnye, Вы писали:

kmn был прав, только для реализации требуется сделать следующее:
Пример
Exe файл:
extern "C" __declspec(dllimport) LONG _stdcall lineConfigDialog(
                         DWORD dwDeviceID,HWND hwndOwner,LPCSTR lpszDeviceClass);
int main(void)
{
 lineConfigDialog(1,0,"lpszDeviceClass");
}

Делаем статическую библиотеку Tapi32.lib:
Создаём Tapi32.def:
LIBRARY TAPI32
EXPORTS
    lineConfigDialog@12

Ложим Tapi32.def рядом с Tapi32.dll.
Запускаем LIB.EXE /MACHINE:I386 /DEF:c:\(путь)\tapi32.def
Рядом образуется Tapi32.lib. Включаем его в проект (Add Files To Folder).
Александр
Re[2]: Как линковать DLL c __stdcall без манглирования
От: ua1zcl Россия www.alexklm.ru
Дата: 15.01.03 15:36
Оценка:
Здравствуйте, ua1zcl, Вы писали:

Я поторопился, при запуске программы вышло сообщение, что lineConfigDialog@12 не найдена!
Так что вопрос открытый, а вобщем, мне не нравится как в MSDN про это умалчивают, ну не надо это Вам знать! — вот как я это понимаю.
Александр
Re[3]: Как линковать DLL c __stdcall без манглирования
От: Valerio Россия linkedin.com/in/boronin
Дата: 15.01.03 15:53
Оценка:
U>Я поторопился, при запуске программы вышло сообщение, что lineConfigDialog@12 не найдена!
U>Так что вопрос открытый, а вобщем, мне не нравится как в MSDN про это умалчивают, ну не надо это Вам знать! — вот как я это понимаю.

все же я бы порекомендовал сделать так: привожу .def, .h, .cpp файлы
это работает для реализации плагина к Fidolook

EXPORTS
    EMH_GetVendorInfo        PRIVATE


#define EMH_GETVENDORINFO_NAME    _T("EMH_GetVendorInfo")
typedef HRESULT (__stdcall *PFN_EMH_GETVENDORINFO)(EMH_VENDORINFO_DATA* pData);


HRESULT WINAPI EMH_GetVendorInfo( EMH_VENDORINFO_DATA* pData )
{
    //code here
}
... << RSDN@Home 1.0 beta 4 >> silent
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.