• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

CPP Builder 6.0 - problem przy kompilacji biblioteki DLL do programu, problem przy deklaracji Obiektu TForm1

VPS Starter Arubacloud
0 głosów
441 wizyt
pytanie zadane 26 września 2017 w C i C++ przez Piotr_Minda Początkujący (380 p.)

Witam, Nazywam się Piotrek, Programowaniem zająłem się niedawno, Kurs Mirosława Zelenta o C++ Konsoli i CPP Builderze przerobiłem z oceną dostateczną, więc postanowiłem napisać swój pierwszy program z wykorzystaniem biblioteki DLL, przy użyciu Popularnego CPP Buildera 6.0, Sam program bez biblioteki skompilował się Poprawnie i działa sprawnie tak jak sobie założyłem.

Program to jest miniaturowa Baza danych Base 2.0 przechowywująca dane i zapisująca bitmapy do pliku, wszystko działa ok, bez biblioteki dll nie ma komunikatu o braku tylko program sie wyłącza :) Ale nie o tym chciałem pisać, Problem zaczyna się przy procesie tworzenia DLLa, do programu. Dllka ma za zadanie wyświetlić AboutProgram i wyświetlić okno ustawień dodania lini i wycięcia lini a także dodania kolumn i ich usunięcia. Szablony mam zrobione Sam About Program kompiluje się ok i działa sprawnie, natomiast problem się pojawia przy dodaniu do projektu formy z ustawieniami settings, mam okodowane wszystko, ale kompilator zwraca:

[C++ Error] SettingsSecton.cpp(19): E2451 Undefined symbol 'Form1'
[C++ Error] SettingsSecton.cpp(24): E2451 Undefined symbol 'Form1'
[C++ Error] SettingsSecton.cpp(29): E2451 Undefined symbol 'Form1'
[C++ Error] SettingsSecton.cpp(34): E2451 Undefined symbol 'Form1'


Legenda:

Form1-> główny program, którego dotyczą ustawenia.

SettingsSection.cpp kod źródłowy sekcji settings głównego programu.

 

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

#include <vcl.h>
#pragma hdrstop

#include "SettingsSecton.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TSettings *Settings;
//---------------------------------------------------------------------------
__fastcall TSettings::TSettings(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TSettings::Button1Click(TObject *Sender)
{
  Form1->StringGrid1->RowCount++;
}
//---------------------------------------------------------------------------
void __fastcall TSettings::Button2Click(TObject *Sender)
{
  Form1->StringGrid1->ColCount++;
}
//---------------------------------------------------------------------------
void __fastcall TSettings::Button3Click(TObject *Sender)
{
  Form1->StringGrid1->RowCount--;
}
//---------------------------------------------------------------------------
void __fastcall TSettings::Button4Click(TObject *Sender)
{
  Form1->StringGrid1->ColCount--;
}
//---------------------------------------------------------------------------
//To jest kod z c++ Buildera 6.0, sekcji settings głównego programu

Form1->Program główny
SettingsSection.cpp -> sekcja ustawień do programu, która ma zostać wyświetlona z biblioteki DLL.

Tutaj jest kod źródłowy biblioteki DLL:

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

#include <vcl.h>
#include <windows.h>
#include "AboutProgram.h"
#include "SettingsSecton.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
extern "C" __declspec(dllexport)void AboutSection(AnsiString pName);
extern "C" __declspec(dllexport)void SettingsSection(AnsiString);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
void AboutSection (AnsiString pName)
{
  TAboutProgramSection *AboutProgram = new TAboutProgramSection(NULL);
  AboutProgram->Label1->Caption = pName;
  AboutProgram->ShowModal();
  delete AboutProgram;
}
void SettingsSection (AnsiString)
{
  TSettings *SettingsSection = new TSettings(NULL);
  SettingsSection->ShowModal();
  delete SettingsSection;
}
//---to jest DLLka do programu głównego Base 2.0---

Mam zadeklarować po prostu tutaj w tej forme Settings plik nagłówka głównego programu? Czy muszę gdzieś indziej to zadeklarować? Pomożecie?

 

 

 

1 odpowiedź

0 głosów
odpowiedź 26 września 2017 przez j23 Mędrzec (194,920 p.)

Musisz  przekazać DLL-ce wskaźnik Form1, bo ten zdefiniowany jest po stronie aplikacji.

Coś w ten deseń:

#include "form1.h"
...


class TSettings
{
private:
	TForm1	*Form1;
	...
};
...


__fastcall TSettings::TSettings(TComponent* Owner, TForm1* form)
: TForm(Owner), Form1(form)
{
}

...


void SettingsSection (TForm1* form)
{
  TSettings *SettingsSection = new TSettings(NULL, form);
  ...
}

 

Rozumiem, że ta DLL-ka to tak w celach edukacyjnych jest pisana...

komentarz 26 września 2017 przez Piotr_Minda Początkujący (380 p.)
Tak, to jest dlla dla celów poznawczych nie dla deweloperki.

Poprubuje, dla pewności:

w #include  mam pisać nazwę nagłówka programu głównego Tak? Coś w ten deseń:

//-------"#include "Base_Program.h------
komentarz 26 września 2017 przez j23 Mędrzec (194,920 p.)

W include ma być nagłówek, w którym zdefiniowana jest klasa TForm1 (dałem tam form1.h, bo z tego, co pamiętam, C++B nadawał domyślnie takie nazwy plikom).

 

PS. zmień kompilator na nowszy.

komentarz 26 września 2017 przez Piotr_Minda Początkujący (380 p.)
edycja 27 września 2017 przez Piotr_Minda
Tak wiem, jednak do mojego tempa nauczania builder idealnie się nadaje.

Mam jeszcze pytanie, Czy ja mam ten kod wpisać do pliku SettingsSection.h?

a void wpisać w kod dlla?  Tak? Proszę wybaczyć takie pytania ale jak piszę nie dawno zacząłem i chcę się upewnić.
komentarz 27 września 2017 przez j23 Mędrzec (194,920 p.)

Czy ja mam ten kod wpisać do pliku SettingsSection.h?

Część do pliku .h, część do .cpp. Podałem ogólny zarys, żebyś zrozumiał, o co mi chodzi. A jak ma być u Ciebie... zrób tak, żeby było dobrze.

 

a void wpisać w kod dlla?

Nie rozumiem pytania...

komentarz 27 września 2017 przez Piotr_Minda Początkujący (380 p.)
void SettingsSection (TForm1* form)
{
  TSettings *SettingsSection = new TSettings(NULL, form);
  ...
} 

o tą część mi chodzi, czy ten przykład(oczywiście pamiętając o własnych nazwach) mam wpisać do kodu dllki?

 

komentarz 27 września 2017 przez j23 Mędrzec (194,920 p.)

Przecież to jest funkcja, którą eksportujesz z DLL-ki, więc chyba oczywistym jest, że jej implementacja ma być w bibliotece.

 

Aha, zapomniałbym. Plik .cpp z implementacjami metod klasy TForm1 też musisz dodać do projektu DLL-ki.

komentarz 27 września 2017 przez Piotr_Minda Początkujący (380 p.)
Kurde dziękować, za obszerne wyjaśnienie, może masz jakieś materiały abym mógł sobie poczytać utrwalić sobie ?
komentarz 27 września 2017 przez j23 Mędrzec (194,920 p.)

Nie mam. Trzymaj się dwóch prostych zasad: 1) nie tworzyć bezsensownie bibliotek dll. 2) nie tworzyć/używać (bez wyraźnej potrzeby) zmiennych globalnych.

 

Poczytaj sobie o tym, jak wygląda proces kompilacji w C/C++, żebyś wiedział na przykład, czym się różni plik nagłówkowy od źródłowego, co to jest internal/external linkage, name mangling itd.

komentarz 27 września 2017 przez Piotr_Minda Początkujący (380 p.)
Zadziałało. Okienko z ustawieniami się uruchamia poprawnie, na razie skasowałem o kodowanie buttonów zostawiłem sam szablon, biblioteka dll się skompilowała, działa zgodnie z założeniami. okno wyświetla się, a gdy nie ma biblioteki lub ma format zmieniony aplikacja się wyłącza, czyli tak jak chciałem. Teraz tylko okodować zdażenia onClick i wszystko.

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
0 głosów
1 odpowiedź 6,350 wizyt
0 głosów
0 odpowiedzi 134 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...