Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Динамическое связывание dll


Автор: Bima 7.2.2007, 08:32
Создаю новый проект. На форму кидаю 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, то все нормально компилируется и нормально работает.

Автор: dumb 7.2.2007, 10:53
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

Автор: Bima 7.2.2007, 12:08
Цитата

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)