Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dll - статическое подключение 
:(
    Опции темы
Bima
Дата 6.2.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

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



пробовал, выдает:
Код

[Linker Error] Unresolved external '_test' referenced from C:\MY PROJECT FOR C++ BILDER\TEST\KOD.OBJ



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Vyacheslav
Дата 6.2.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 47
Всего: 59



Цитата(Bima @  6.2.2007,  11:47 Найти цитируемый пост)
bool Test(char *param1);

так test или Test ?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Bima
Дата 7.2.2007, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

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



объявлялась в dll как Test.
но пробовал по всякому(и с маленькой и с большой буквы), не помогает



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
dumb
Дата 7.2.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 32
Всего: 158



осталось только __stdcall воткнуть в обявление Test'а этого... smile
PM MAIL   Вверх
Bima
Дата 7.2.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

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



Уже лучше, компилится проект стал. При запуске выдает, что нет определенной dll, нужной для работы вызываемой dll, "повторный запуск приложения исправит эту проблему".

Незнаю, кто писал эту Dll smile. Сегодня исходники достал, буду изучать и попытаюсь обойтись без этой dll.
всем спасибо


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Lotrex
Дата 7.2.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

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



Не спеши расстраиваться, это решаемая проблема. :-)
счас напишу ответ.
PM MAIL ICQ   Вверх
Lotrex
Дата 7.2.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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:

Код

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

extern "C" __declspec(dllexport)  int __stdcall Test(const char *str)
{
    MessageBox(NULL, str, "Hello", MB_OK | MB_ICONINFORMATION);
    return 1;
}


Это тексты заголовочного файла и тестовой проги в Builde-ре:

Код

//Заголовок:
#ifndef ___MSVC_DLL_TEST
#define ___MSVC_DLL_TEST

extern "C" __declspec(dllexport) int __stdcall  _Test(const char *);

#endif

//Прога:
//---------------------------------------------------------------------------
#include <windows.h>
#pragma hdrstop
#include "testdll.h"
//---------------------------------------------------------------------------
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    _Test("Привет, мир!");
    return 0;
}
//---------------------------------------------------------------------------


PM MAIL ICQ   Вверх
Bima
Дата 8.2.2007, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

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



Мдя, смотрел исходники... они изрядно удивили меня smile
они там объявляются без всяких extern "C" или __declspec(dllexport)  или __stdcall
вот кусок кода заголовочного файла:
Код

bool Test(char *param1);
// -----------------------------------------------------------------------
// Проверка состояния проекта (в данном случае проверка ТОЛЬКО на останов)
int ProjectStatus(void);

Писалось на MSVC 6.0. Вот и думаю, либо пересобрать DLL заново только по нормальному объявлять функции, либо напрямую использовать свои функции в проекте.

Кстати, если выполнить команду impdef Test.def Test.dll
то в файле Test.def, можно увидеть название всех функций без всяких подчеркиваний smile


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Lotrex
Дата 8.2.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

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



Цитата

Писалось на MSVC 6.0. Вот и думаю, либо пересобрать DLL заново только по нормальному объявлять функции, либо напрямую использовать свои функции в проекте.

Кстати, если выполнить команду impdef Test.def Test.dll
то в файле Test.def, можно увидеть название всех функций без всяких подчеркиваний


Приведенный мной текст dll-ки после компиляции и выполнения команды

impdef testdll.def testdll.dll

дает такой результат(содержимое файла testdll.def):
Код

LIBRARY     TESTDLL.DLL

EXPORTS
    _Test@4                       =_Test                          @1

Странно, что у Вас нет подчеркиваний... Или у нас объявления отличаются... А может, дело в ключах компилятора 
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" или __declspec(dllexport)  или __stdcall
вот кусок кода заголовочного файла:

Код

 bool Test(char *param1);
// -----------------------------------------------------------------------
// Проверка состояния проекта (в данном случае проверка ТОЛЬКО на останов)
int ProjectStatus(void);



Если не использовать extern "C" то компилятор С++ будет модифицировать
имена функций как взбрело в голову создателю данного компилятора. И подключить такую
dll, если она скомпилирована на MSVC, к проге на C++ Builder вряд ли возможно.
Я изменил приведенный мной выше текст dll-ки следующим образом(убрал extern "C"):
Код

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                )
{
    return TRUE;
}
//extern "C"
__declspec(dllexport)  int __stdcall Test(const char *str)
{
    MessageBox(NULL, str, "Hello", MB_OK | MB_ICONINFORMATION);
    return 1;
}

После компиляции в MSVC 6.0 и после компиляции и выполнения команды
impdef testdll.def testdll.dll
получается такой результат:
Код

LIBRARY     TESTDLL2.DLL

EXPORTS
    ?Test@@YGHPBD@Z                @1


Так что я думаю, что Вам надо перед всеми функциями поставить новые
объявления, например так:
Код

#define EXPORT(type) extern "C" __declspec(dllexport) type __stdcall

EXPORT(bool) Test(const char *str);




Это сообщение отредактировал(а) Lotrex - 8.2.2007, 09:16
PM MAIL ICQ   Вверх
Bima
Дата 8.2.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

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



вот что я получил после команды impdef test.def test.dll:

Код

LIBRARY     TEST.DLL

EXPORTS
    Test                  @1   ; Test
    ProjectStatus                  @2   ; ProjectStatus
//другие функции


какие команды были при компиляции я не знаю

Цитата

Так что я думаю, что Вам надо перед всеми функциями поставить новые
объявления, например так:

#define EXPORT(type) extern "C" __declspec(dllexport) type __stdcall

EXPORT(bool) Test(const char *str);

поставлю MSVC и попробую


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Vyacheslav
Дата 8.2.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 47
Всего: 59



MSVC может обходится без __declspec(dllexport), по-скольку у него есть возможность просто задать имена функция, которые будут экпортироваться, в def -файле с помощью ключевого слова EXPORT
Цитата

Note that when you export a variable from a DLL with a .def file, you do not need to specify __declspec(dllexport) on the variable. However, in any file that uses the DLL, you must still use __declspec(dllimport) on the declaration of data.



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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