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

Klasy w dll-ce

Object Storage Arubacloud
0 głosów
324 wizyt
pytanie zadane 1 marca 2017 w C i C++ przez niezalogowany
edycja 2 marca 2017

Wszystkie moje funkcje, które mam w dll-ce i mają w sobie pomocnicze zmienne automatyczne klasy fstream nie działają. Gdy debuguję to dostaję SIGSEGV. W konsoli wyświetla się błąd 0xC0000005 lub 0xFF i wywala.

gdy f funkcji głównej program dojdzie do tej linii

cout<<counting("pliku.txt");

to wywala "Program przestał działać".

Oto plik text.h (którego nie załączam w projekcie bo nie mam w dll-ce klas, a pozostałe funkcje działają prawidłowo bez niego)

#ifndef __TEXT_H__
#define __TEXT_H__

using namespace std;

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);

bool DLL_EXPORT is_white(string linia); //sprawdza czy linia składa sie jedynie z białych znaków lub jest pusta
bool DLL_EXPORT is_comp_empty(string linia); //sprawdza czy linia jest pusta
bool DLL_EXPORT is_comment(string linia); //sprawdza czy linia jest komentarzem
bool DLL_EXPORT is_int_convert(string linia); //sprawdza czy linię można przekonwertować na liczbę całkowitą
string DLL_EXPORT without(string linia, char znak); //zwraca linię bez znaku przekazanego jako argument
string DLL_EXPORT inttostr(int liczba); //konwertuje liczbę całkowitą na ciąg znaków
string DLL_EXPORT substitute(string tekst, string co, string na_co); //wyszukuje w tekście frazę i zastępuje ją określonym ciągiem znaków
string DLL_EXPORT read(string nazwa, int nr); //zwraca konkretną linijkę z pliku
int DLL_EXPORT counting(string nazwa); //zlicza ilość linii w pliku
void DLL_EXPORT rewrite(string p1, string p2); //przepisuje całą zawartość pliku do innego pliku

//Funkcje korzystające z biblioteki <vector>
void DLL_EXPORT paste(string nazwa, string tekst, int nr); //wstawia w pliku w określoną linię jakiś tekst, przesuwając niższe o 1 w dół
void DLL_EXPORT cut(string nazwa, int nr); //usuwa z pliku określoną linię, przesuwając niższe o 1 w górę

#ifdef __cplusplus
}
#endif

#endif // __TEXT_H__

 

A oto nie działające funkcje z text.cpp

string DLL_EXPORT read(string nazwa, int nr)
{
	fstream plik;
	string linia;
	int n=1;
	
	plik.open(nazwa.c_str(), ios::in);
	while(getline(plik,linia))
	{
		if(n == nr)
			return linia;
		n++;
	}
	plik.close();
}

int DLL_EXPORT counting(string nazwa)
{
	fstream plik;
	string linia;
	int ilosc_linii=0;
	plik.open(nazwa.c_str(), ios::in);
	while(getline(plik,linia))
		ilosc_linii++;
	plik.close();
	
	return ilosc_linii;
}

void DLL_EXPORT rewrite(string p1, string p2)
{
	fstream plik1,plik2;
	string linia1;
	
	plik1.open(p1.c_str(), ios::in);
	plik2.open(p2.c_str(), ios::out);
	{
		while(getline(plik1,linia1))
			plik2<<linia1<<endl;
	}
	plik1.close();
	plik1.clear();
	plik2.close();
	plik2.clear();
}

 

Ktoś wie jak to jest z tymi plikami?

3 odpowiedzi

0 głosów
odpowiedź 2 marca 2017 przez niezalogowany
edycja 2 marca 2017
Serio, nikt nic? Nikt nie miał takiego problemu? Da się w ogóle tworzyć funkcje i klasy współpracujące z plikami? Czy muszę sobie odpuścić ten pomysł i nadal tworzyć .h i .cpp? Gdzieś na internecie natknąłem się na informację o funkcji GetModuleFileName, ale nie wiem jak jej użyć i czy coś daje.

Oprócz tego kompilator wyrzuca błąd "vector does not name a type" gdy tworzę w klasie w dll-ce atrybut będący wektorem, a mając pliki .h i .cpp wszystko jest ok. Czy biblioteki dll są takie ułomne czy są jednak rozwiązania tych problemów? Na początku poniósł mnie entuzjazm, że dll-ki są takie fajne, że ogarnąłem dynamiczne linkowanie klas, że mniejsze zużycie pamięci i w ogóle. Ale po tych problemach, na które nie znalazłem odpowiedzi w internecie, to zwątpiłem.
0 głosów
odpowiedź 3 marca 2017 przez j23 Mędrzec (194,920 p.)

Używasz typu std::string w argumentach, więc podejrzewam, że może być problem ze stertami - dll-ka i exek mogą mieć swoje sterty. W momencie gdy dll-ka spróbuje usunąć pamięć przydzieloną przez stertę po stronie exeka,  nastąpi wystrzał aplikacji. Nie wiem, jakiego kompilatora używasz, ale poszukaj opcji, która pozwoli ustawić dynamiczne linkowanie bibliotek standardowych (w obu projektach). Czasem to pomaga.

0 głosów
odpowiedź 4 marca 2017 przez niezalogowany
Używam Code Blocksa

Podobne pytania

0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 25 lutego 2017 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 84 wizyt
pytanie zadane 16 października 2023 w C# przez kubekszklany Gaduła (3,190 p.)
0 głosów
0 odpowiedzi 197 wizyt
pytanie zadane 25 stycznia 2023 w C i C++ przez hicodyn Początkujący (420 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...