![]() |
|
|
![]()
|
|
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
У меня есть DLL и Lib к ней - by MSVC++.
Как с помощью lib в С++ Builder подключить мою DLL? |
|||
|
||||
| NiJazz |
|
||||||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Я беру dll без lib и прогоняю её через утилиту implib. Создаётся lib типа OMF, то есть подходящая для билдера. В коде подключаю её:
Вот что получаю:
В чём тут может быть дело? PS Где в свойствах проекта в билдере можно указать подключаемые библиотеки? Добавлено @ 17:43 Забыл сказать, что в проекте VC++ я указал, что экспортировать функцию нужно понятно для других компилеров, поэтому impdef и прочие не помогут. Добавлено @ 17:44 Экспортируемая DLL функция:
Это сообщение отредактировал(а) NiJazz - 17.4.2005, 17:45 |
||||||
|
|||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
View->Project Manager->правая клавиша мышки на проекте->всплывающее меню-> Add
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Мне ж не cpp, a lib нужно добавить.
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
есть у меня подозрение что для статической линковки заголовочный файл нужен...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
И что из этого? Уже начинает надоедать. Говоришь как надо делать. Вместо того, чтобы сделать как сказали, начинаются теоретические рассуждения.
Ты пробовал? Уверен, что нет. Если религиозные убеждения не позволяют воспользоваться этим советом, вставляй через
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Vyacheslav
Теории тут нет, просто невнимательность. До этого я подключал прагмой. _hunter Ну h-файл конечно есть. |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Ситуация, как в теме, только за исключением того, что нет *.h файла.
Короче говоря есть Dll и я могу сделать lib через утилиту implib, еще известны какие там функции с параметрами вызова. Если добавляю через View->Project Manager... Add, то насколько я понимаю, нет заголовочного файла, где описаны функции, поэтому, при вызове этих функций, компилятор ругается. как правильно сделать, если есть test.dll (созданая не мной, на Delphi, исходников нет) и в этой dll, есть функция: test: function (param1: PChar): Boolean cdecl; Предпологаю, что ее нужно наверно записать как bool test(char* param1); Это сообщение отредактировал(а) Bima - 5.2.2007, 13:11 -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Динамически я могу подключить эту dll.
код при динамическом подключении такой: *.h
*.cpp
Неудобно постоянно получать адрес функции. У меня этих функций в dll штук 20 и постоянно узнавать их адрес, как то не удобно, хотелось бы один раз объявить эти функции и пользоваться. Это сообщение отредактировал(а) Bima - 6.2.2007, 10:43 -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Пытаюсь статически подключить так:
создал файл test.h
В *.cpp пишу так:
при компилировании мне выдает ошибку: [Linker Error] Unresolved external 'test(char *)' referenced from C:\MY PROJECT FOR C++ BILDER\test\KOD.OBJ Это сообщение отредактировал(а) Bima - 6.2.2007, 10:44 -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Bima,
Вы весь топик внимательно читали? Создатель топика начинал с
Ему вежливо намекнули, что он не прав. Надо либо
либо использовать
А Вы опять на те же грабли
Эта штука не работает. Уж не знаю почему, но неработает -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| Bima |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
читал и пробовал!!!
когда делаю через View->Project Manager->правая клавиша мышки на проекте->всплывающее меню-> Add (кстати я упоминал что и так делал), то ошибка таже самая:
когда делаю через
то же выскакивает ошибка
-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||
|
|||||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
дык а переменная test вида char*, это переменная из твоей либы или как ?
-------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
или как...
я знаю как функция объявлялась, когда писалась.... bool Test(char *param1); либ я сделал с помощью implib Dll работает, проверялась на дельфи и мой код динамического присоединения (см. выше). -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Добавлено @ 14:16 Виноват. Скорее всего так
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
пробовал, выдает:
-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
объявлялась в dll как Test.
но пробовал по всякому(и с маленькой и с большой буквы), не помогает -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
осталось только __stdcall воткнуть в обявление Test'а этого...
|
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Уже лучше, компилится проект стал. При запуске выдает, что нет определенной dll, нужной для работы вызываемой dll, "повторный запуск приложения исправит эту проблему".
Незнаю, кто писал эту Dll всем спасибо -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: нет Всего: 3 |
Не спеши расстраиваться, это решаемая проблема. :-)
счас напишу ответ. |
|||
|
||||
| Lotrex |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: нет Всего: 3 |
Все дело в том, что C++ Builder и MSVC (черт бы побрал их обоих :-)) по разному
понимают слова __stdcall и __cdecl. То есть объявления и тут и там одинаковые, а после компиляции получается совсем разное (я уж не говорю про ситуацию, кагда в начале опущено extern "C" ) Вот такое объявление функции: extern "C" __declspec(dllexport) int __stdcall Test(const char *); после компиляции Builde-ром версии 5.0 никак не изменит исходное имя функции - в объектном файле так и будет сидеть Test то же самое объявление после компиляции MSVC 6.0 у меня дало в объектном файле _Test. Какой напрашивается выход? Если функция в исходнике DLL-ки объявлена например как extern "C" __declspec(dllexport) int __stdcall Test(const char *); то в заголовочном файле, который будет для Builde-ра надо написать то же имя функции, но с черточкой впереди: extern "C" __declspec(dllexport) int __stdcall _Test(const char *); После этого все фурыкает без проблем, даже если в функции не один параметр, а несколько. Разумеется, все это работает тока в том случае, если Вы сделали .lib файл с помощью implib и вставили его (этот .lib-файл) в Ваш проект. Вот мои художества: Этот файл компилился в MSVC 6.0 как dll:
Это тексты заголовочного файла и тестовой проги в Builde-ре:
|
||||
|
|||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Мдя, смотрел исходники... они изрядно удивили меня
они там объявляются без всяких extern "C" или __declspec(dllexport) или __stdcall вот кусок кода заголовочного файла:
Писалось на MSVC 6.0. Вот и думаю, либо пересобрать DLL заново только по нормальному объявлять функции, либо напрямую использовать свои функции в проекте. Кстати, если выполнить команду impdef Test.def Test.dll то в файле Test.def, можно увидеть название всех функций без всяких подчеркиваний -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Lotrex |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: нет Всего: 3 |
Приведенный мной текст dll-ки после компиляции и выполнения команды impdef testdll.def testdll.dll дает такой результат(содержимое файла testdll.def):
Странно, что у Вас нет подчеркиваний... Или у нас объявления отличаются... А может, дело в ключах компилятора MSVC? У меня был следующий набор ключей: /nologo /MTd /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TESTDLL_EXPORTS" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
Если не использовать extern "C" то компилятор С++ будет модифицировать имена функций как взбрело в голову создателю данного компилятора. И подключить такую dll, если она скомпилирована на MSVC, к проге на C++ Builder вряд ли возможно. Я изменил приведенный мной выше текст dll-ки следующим образом(убрал extern "C"):
После компиляции в MSVC 6.0 и после компиляции и выполнения команды impdef testdll.def testdll.dll получается такой результат:
Так что я думаю, что Вам надо перед всеми функциями поставить новые объявления, например так:
Это сообщение отредактировал(а) Lotrex - 8.2.2007, 09:16 |
||||||||||||||
|
|||||||||||||||
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
вот что я получил после команды impdef test.def test.dll:
какие команды были при компиляции я не знаю
поставлю MSVC и попробую -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
MSVC может обходится без __declspec(dllexport), по-скольку у него есть возможность просто задать имена функция, которые будут экпортироваться, в def -файле с помощью ключевого слова EXPORT
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |