Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > __stdcall и имена функций


Автор: BorisVorontsov 27.1.2007, 13:26
Есть библиотка MyLib, экспортирующая __stdcall функции MyFunctionOne и MyFunctionTwo.
Есть MyLib.lib, с перечнем функций, экспортируемых библиотекой (то есть MyFunctionOne и MyFunctionTwo).

В проекте на VC++ 6 поключаю MyLib.lib, например, так:

Код
#pragma comment(lib, "MyLib.lib")


И декларирую функции так:

Код
extern "C" __declspec(dllimport) int __stdcall MyFunctionOne (%аргументы%);
extern "C" __declspec(dllimport) int __stdcall MyFunctionTwo (%аргументы%);


На свое удивление получаю:

Цитата
error LNK2001: unresolved external symbol __imp__MyFunctionOne@%номер%


Внимание, вопрос:

Как заставить VC++ не портить имена функций с конвенцией __stdcall?

Автор: Andrey44 27.1.2007, 22:19
А вы подключили в проект #include"ваш_файл.h" smile 

Автор: BorisVorontsov 28.1.2007, 05:59
Зачем мне файл *.h?

Автор: Любитель 30.1.2007, 02:27
Хейдер майлибы в студию.

Автор: BorisVorontsov 30.1.2007, 13:10
Цитата(BorisVorontsov @  28.1.2007,  05:59 Найти цитируемый пост)
Зачем мне файл *.h?


Автор: Любитель 30.1.2007, 22:31
Млин, как обявлена экспортированная функция?

Автор: Earnest 31.1.2007, 13:36
Цитата(BorisVorontsov @  27.1.2007,  14:26 Найти цитируемый пост)
На свое удивление получаю:

Было бы чему удивляться. Объявление влияет на реальное имя. Можно экспортировать как C, так и C++ имена, но они, естественно должны совпадать как при экспорте, так и при импорте. Либо везде ставь extern С, либо везде убирай. 

Автор: BorisVorontsov 31.1.2007, 19:44
Цитата(Любитель @  30.1.2007,  22:31 Найти цитируемый пост)
Млин, как обявлена экспортированная функция?


Читай первый пост. Внимательно.

Цитата(Earnest @  31.1.2007,  13:36 Найти цитируемый пост)
Было бы чему удивляться. Объявление влияет на реальное имя. Можно экспортировать как C, так и C++ имена, но они, естественно должны совпадать как при экспорте, так и при импорте.


Какая проницательность...  smile А я думал, что это очевидно.

Цитата(Earnest @  31.1.2007,  13:36 Найти цитируемый пост)
Либо везде ставь extern С, либо везде убирай. 


DLL не моя, без исходников.
Собственно, вопрос стоял так - как отключить декорацию имен импортируемых __stdcall функций в VC++.

Автор: Любитель 4.2.2007, 16:14
Цитата(BorisVorontsov @  31.1.2007,  19:44 Найти цитируемый пост)

>> Млин, как обявлена экспортированная функция?

Читай первый пост. Внимательно.


Читаю. Внимательно. Нахожу только объявление импорта. Если библиотека не твоя, тос чего ты взял, что она там не декорирована. Ты уже тогда поменять ничего не в силе и должен её объявить так (с экстерн "C" или без) как и в самой либе.  smile 

Автор: BorisVorontsov 6.2.2007, 21:59
Любитель, для самых непонятливых:

Цитата(BorisVorontsov @  27.1.2007,  13:26 Найти цитируемый пост)
Есть библиотка MyLib, экспортирующая __stdcall функции MyFunctionOne и MyFunctionTwo.


Если тебе нравятся красивые слова терминологии, перевожу:

Есть WINAPI библиотека, в таблице экспорта которой (что так же указано в её документации) имеются функции MyFunctionOne и MyFunctionTwo.

Автор: Любитель 7.2.2007, 18:27
Млиин... Речь про то, что экспорт идёт с extern "C" или нет  smile 

Посмотри чем угодно таблицу экспорта DLL-ки - проверь имена функций.

Цитата(BorisVorontsov @  6.2.2007,  21:59 Найти цитируемый пост)
WINAPI

 smile Вообще говоря WinAPI - Windows API. В MSDN поиск по 
Цитата(BorisVorontsov @  6.2.2007,  21:59 Найти цитируемый пост)
MyFunctionOne и MyFunctionTwo

не даёт результатов.

Автор: BorisVorontsov 9.2.2007, 21:13
OMFG.

Цитата(Любитель @  7.2.2007,  18:27 Найти цитируемый пост)
Посмотри чем угодно таблицу экспорта DLL-ки - проверь имена функций.

Цитата(BorisVorontsov @  6.2.2007,  21:59 Найти цитируемый пост)
в таблице экспорта которой (что так же указано в её документации) имеются функции MyFunctionOne и MyFunctionTwo


Цитата(Любитель @  7.2.2007,  18:27 Найти цитируемый пост)
 Вообще говоря WinAPI - Windows API. 


Вообще говоря (windef.h):
Код
#define WINAPI      __stdcall



Цитата(Любитель @  7.2.2007,  18:27 Найти цитируемый пост)
В MSDN поиск по 
Цитата(BorisVorontsov @  6.2.2007,  21:59 Найти цитируемый пост)
MyFunctionOne и MyFunctionTwo

не даёт результатов.


Это 5 smile 

Автор: Любитель 9.2.2007, 21:29
BorisVorontsov, ну неужели не понятно - я прошу проверить декорированность имён.

А насчёт второго - ты вообще глупость сморозил. А если в библиотеки Васи Пупкина есть такой код (достаточно типичный):
Код

#ifdef VASJA_PUPKIN_LIB_BUILDING
#  define VASJA_PUPKIN_API __declspec(dllexport)
#else
#  define VASJA_PUPKIN_API __declspec(dllimport)
#endif

из этого вовсе не следует, что __declspec(dllexport/dllimport) есть API Васи Пупкина.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)