Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое связывание dll 
V
    Опции темы
Bima
Дата 7.2.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создаю новый проект. На форму кидаю Label и Button. К проекту добавляю новый Unit.
в новом Unit пишу:
Modul.h
Код

//---------------------------------------------------------------------------
#ifndef ModulH
#define ModulH
#include <windows.h>

HINSTANCE dllinstance;

typedef int __declspec (dllimport) pProjectStatus(void);
pProjectStatus *ProjectStatus;

void LoadDLL(void);

//---------------------------------------------------------------------------
#endif

Modul.cpp
Код

//---------------------------------------------------------------------------
#pragma hdrstop

#include "Modul.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
void LoadDLL(void)
{
dllinstance = LoadLibrary("ODK_RW_Tags.dll");
if(!dllinstance) // если dll не была загружена
   {
   //Application->MessageBox("Не могу найти ODK_RW_Tags.dll. Она должна где-то быть!","Ошибка",MB_ICONWARNING);
   return;
   }
else
   {
   ProjectStatus = (pProjectStatus*)GetProcAddress(dllinstance,"ProjectStatus");
   }
}
//---------------------------------------------------------------------------

код формы:
kod.cpp
Код

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

#include "kod.h"
#include "Modul.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
LoadDLL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int Ret;

Ret=ProjectStatus();
Label1->Caption =IntToStr(Ret);
}
//---------------------------------------------------------------------------

kod.h
Код

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

#ifndef kodH
#define kodH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TButton *Button1;
   TLabel *Label1;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

начинаю компилировать, мне ВСВ выдает предупреждение:
Код

[Linker Warning] Public symbol '_dllinstance' defined in both module C:\MY PROJECT FOR C++ BILDER\TEST\KOD.OBJ and C:\MY PROJECT FOR C++ BILDER\TEST\MODUL.OBJ
[Linker Warning] Public symbol '_ProjectStatus' defined in both module C:\MY PROJECT FOR C++ BILDER\TEST\KOD.OBJ and C:\MY PROJECT FOR C++ BILDER\TEST\MODUL.OBJ

Не могу понять, как я мог дважды объявит в разных модулях переменную dllinstance и функцию ProjectStatus ???
Если я переношу все в один модуль, то есть из Modul.h в kod.h (в public), а код функции LoadDLL переношу в FormCreate, то все нормально компилируется и нормально работает.


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

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


sceloglauxalbifacies
****


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

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



Modul.h:
Код

...
extern HINSTANCE dllinstance;
...
extern pProjectStatus *ProjectStatus;
...


Modul.cpp:
Код

#include "Modul.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

HINSTANCE dllinstance;
pProjectStatus *ProjectStatus;

void LoadDLL(void)
...


базовые знания языка хромают. сильно. smile

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


Опытный
**


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

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



Цитата

базовые знания языка хромают. сильно.

без форума и практики хромали бы еще сильнее smile 

тема закрыта.


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

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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