Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __stdcall и имена функций 
:(
    Опции темы
BorisVorontsov
Дата 27.1.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



Есть библиотка 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?


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Andrey44
Дата 27.1.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 28.1.2007, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



Зачем мне файл *.h?


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Любитель
Дата 30.1.2007, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Хейдер майлибы в студию.


--------------------
PM MAIL ICQ Skype   Вверх
BorisVorontsov
Дата 30.1.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



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




--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Любитель
Дата 30.1.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



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


--------------------
PM MAIL ICQ Skype   Вверх
Earnest
Дата 31.1.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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



--------------------
...
PM   Вверх
BorisVorontsov
Дата 31.1.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



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


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

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


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

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


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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Любитель
Дата 4.2.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата(BorisVorontsov @  31.1.2007,  19:44 Найти цитируемый пост)

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

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


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



--------------------
PM MAIL ICQ Skype   Вверх
BorisVorontsov
Дата 6.2.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



Любитель, для самых непонятливых:

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


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

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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Любитель
Дата 7.2.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Млиин... Речь про то, что экспорт идёт с extern "C" или нет  smile 

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

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
BorisVorontsov
Дата 9.2.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



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 



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Любитель
Дата 9.2.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



BorisVorontsov, ну неужели не понятно - я прошу проверить декорированность имён.

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.