Поиск:

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


Jazz coder
****


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

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



У меня есть DLL и Lib к ней - by MSVC++.
Как с помощью lib в С++ Builder подключить мою DLL?
PM MAIL   Вверх
NiJazz
Дата 17.4.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Я беру dll без lib и прогоняю её через утилиту implib. Создаётся lib типа OMF, то есть подходящая для билдера. В коде подключаю её:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma comment (lib, "1.lib")  // Подключаем lib

void Test();


TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Test();
}
//---------------------------------------------------------------------------

Вот что получаю:
Цитата
[Linker Error] Unresolved external 'Test()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\1\UNIT1.OBJ

В чём тут может быть дело? smile
PS Где в свойствах проекта в билдере можно указать подключаемые библиотеки?
Добавлено @ 17:43
Забыл сказать, что в проекте VC++ я указал, что экспортировать функцию нужно понятно для других компилеров, поэтому impdef и прочие не помогут.
Добавлено @ 17:44
Экспортируемая DLL функция:
Код

__declspec(dllexport) void __stdcall Test()
{
    MessageBox(NULL, "Hello, Builder!", "Hello", MB_OK | MB_ICONINFORMATION);
}


Это сообщение отредактировал(а) NiJazz - 17.4.2005, 17:45
PM MAIL   Вверх
Vyacheslav
Дата 18.4.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



View->Project Manager->правая клавиша мышки на проекте->всплывающее меню-> Add


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


Jazz coder
****


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

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



Мне ж не cpp, a lib нужно добавить.
PM MAIL   Вверх
_hunter
Дата 18.4.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



есть у меня подозрение что для статической линковки заголовочный файл нужен...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Vyacheslav
Дата 18.4.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



И что из этого? Уже начинает надоедать. Говоришь как надо делать. Вместо того, чтобы сделать как сказали, начинаются теоретические рассуждения.
Ты пробовал? Уверен, что нет.
Если религиозные убеждения не позволяют воспользоваться этим советом, вставляй через
Код

#pragma link 



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


Jazz coder
****


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

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



Vyacheslav
Теории тут нет, просто невнимательность.
До этого я подключал прагмой.


_hunter
Ну h-файл конечно есть. smile Без него мы до линковки бы даже не дошли. smile
PM MAIL   Вверх
Bima
Дата 5.2.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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


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

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


Опытный
**


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

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



Динамически я могу подключить эту dll.

код при динамическом подключении такой:

*.h
Код

//---------------------------------------------------------------------------

#ifndef kodH
#define kodH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>

typedef bool(*pTest)(char *param1);
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TLabel *Label1;
   TButton *Button1;
        void __fastcall FormDestroy(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
        HINSTANCE dllinstance;
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


*.cpp
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "kod.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int Ret;
dllinstance = LoadLibrary("Test.dll");
if(!dllinstance) // если dll не была загружена
   {
   Application->MessageBox("Не могу найти Test.dll. Она должна где-то быть!","Ошибка",MB_ICONWARNING);
   return;
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
FreeLibrary(dllinstance);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool Ret;
AnsiString aaa="a";
pTest Test= (pTest)GetProcAddress(dllinstance,"Test");
Ret=Test(aaa.c_str());
if (Ret)
   Application->MessageBox("true","Cool",MB_ICONWARNING);
else
   Application->MessageBox("false","Cool",MB_ICONWARNING);
}
//---------------------------------------------------------------------------


Неудобно постоянно получать адрес функции. У меня этих функций в dll штук 20 и постоянно узнавать их адрес, как то не удобно, хотелось бы один раз объявить эти функции и пользоваться.

Это сообщение отредактировал(а) Bima - 6.2.2007, 10:43


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

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


Опытный
**


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

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



Пытаюсь статически подключить так:
создал файл test.h
Код

__declspec(dllimport) bool test(char *param1);



В *.cpp пишу так:

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "kod.h"
#include "test.h"
#pragma comment(lib,"test.lib")
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool Ret;
AnsiString aaa="a";
Ret=Test(aaa.c_str());
if (Ret)
   Application->MessageBox("true","Cool",MB_ICONWARNING);
else
   Application->MessageBox("false","Cool",MB_ICONWARNING);

}
//---------------------------------------------------------------------------

при компилировании мне выдает ошибку:

[Linker Error] Unresolved external 'test(char *)' referenced from C:\MY PROJECT FOR C++ BILDER\test\KOD.OBJ


Это сообщение отредактировал(а) Bima - 6.2.2007, 10:44


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

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


Эксперт
****


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

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



Bima, 
Вы весь топик внимательно читали?
Создатель топика начинал с
Код

#pragma comment (lib, "1.lib")  

Ему вежливо намекнули, что он не прав. Надо либо
Цитата(Vyacheslav @  18.4.2005,  10:13 Найти цитируемый пост)
View->Project Manager->правая клавиша мышки на проекте->всплывающее меню-> Add 

либо использовать
Код

#pragma link “test.lib”

А Вы опять на те же грабли 
Код

#pragma comment(lib,"test.lib")

Эта штука не работает. Уж не знаю почему, но неработает


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


Опытный
**


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

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



читал и пробовал!!!
когда делаю через View->Project Manager->правая клавиша мышки на проекте->всплывающее меню-> Add (кстати я упоминал что и так делал), то ошибка таже самая:
Код

[Linker Error] Unresolved external 'test(char *)' referenced from C:\MY PROJECT FOR C++ BILDER\test\KOD.OBJ


когда делаю через 
Код

 #pragma link “test.lib” 

то же выскакивает ошибка 
Код

[Linker Error] Unresolved external 'test(char *)' referenced from C:\MY PROJECT FOR C++ BILDER\test\KOD.OBJ






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

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


Naughtius Maximus
****


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

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



дык а переменная test вида char*, это переменная из твоей либы или как ?




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Bima
Дата 6.2.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



или как...
я знаю как функция объявлялась, когда писалась....

bool Test(char *param1);

либ я сделал с помощью implib

Dll работает, проверялась на дельфи и мой код динамического присоединения (см. выше).


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

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


Эксперт
****


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

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



Цитата(Bima @  5.2.2007,  13:11 Найти цитируемый пост)
test: function (param1: PChar): Boolean cdecl;

Код

 __declspec(dllimport) __cdecl  bool test(char *param1);



Добавлено @ 14:16 
Виноват. Скорее всего так
Код

extern "C"  __declspec(dllimport)   bool test(char *param1);



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

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

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

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

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


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

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


 




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


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

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