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