Witam. Postanowiłem korzystając z tego
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/DLL/198
poradnika przerobić parę konsolowych klas na WinAPI i umieścić je w dllkach.
Gdy stworzyłem prostą klasę Punkt w dll-ce i miała ona konstruktor (2 inty) to poradziłem sobie tak, że funkcja CreatePunkt wyglądała tak:
Punkt* DLL_EXPORT CreatePunkt(int a, int b) { return new Punkt(a,b); }
Otóż mam też klasę, w której konstruktorze trzeba podać dwa wskaźniki do tablic stringów. Oto plik menu.h:
#include <iostream> using namespace std; class Menu { public: string str_wybor; string *opcje; int opcji; Menu(int,int,string*,string*, string="",int=1,int=1); ~Menu(); void wyswietl(); //wyświetla główne opcje w menu void wybierz(); //czyta wybór użytkownika private: string *tematy; int tematow; int wybor; int pom; };
A to plik menu.cpp:
#include <iostream> #include <fstream> #include <cstdlib> #include <windows.h> #include "menu.h" #include "text.h" #include "coding.h" using namespace std; Menu::Menu(int o, int t, string *op, string *tem, string sw, int w, int p) { opcji=o; tematow=t; str_wybor=sw; wybor=w; pom=p; opcje = new string [opcji+1]; string *wsk1 = opcje; string *wsk2 = op; for(int i=0; i<opcji; i++) { *wsk1 = *wsk2; wsk1++; wsk2++; } tematy = new string [tematow]; string *wsk3 = tematy; string *wsk4 = tem; for(int i=0; i<tematow; i++) { *wsk3 = *wsk4; wsk3++; wsk4++; } } Menu::~Menu() { delete [] opcje; delete [] tematy; } void Menu::wyswietl() { fstream plik; string linia; plik.open("tymczasowe menu.txt", ios::out); pom=1; for(int l=0; l<opcji; l++) { if(l==0) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11); cout<<opcje[l]<<endl<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); plik<<opcje[l]<<endl<<endl; } else { if( int(opcje[l][0])!=9 ) { if( is_int_convert(opcje[l]) ) { cout<<pom<<". "<<tematy[ atoi(opcje[l].c_str())-1 ]<<endl; pom++; } else { cout<<pom<<". "<<opcje[l]<<endl; pom++; } } plik<<opcje[l]<<endl; } } plik.close(); } void Menu::wybierz() { cout<<"\nWprowadź wybór: "; bool czy_wybrano=false; if(str_wybor!="") czy_wybrano=true; cin>>str_wybor; while( !((is_int_convert(str_wybor) && atoi(str_wybor.c_str())>0 && atoi(str_wybor.c_str())<pom) || (str_wybor=="z"&& czy_wybrano==true)) ) { if(str_wybor=="z"&& czy_wybrano==false) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4); cout<<"Nie wprowadzono wyboru\n"; cin>>str_wybor; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4); cout<<"Nieprawidłowe dane. Wprowadź jeszcze raz: "; cin>>str_wybor; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); } } if( str_wybor != "z") { pom=1; wybor = atoi(str_wybor.c_str()); ////////////////////////////// for(int i=0; i<=opcji; i++) opcje[i] = ""; int i=0; fstream plik; string linia; plik.open("tymczasowe menu.txt", ios::in); while(getline(plik,linia)) { if(linia.size()==0) continue; opcje[i] = linia; i++; } plik.close(); ////////////////////////////// i=0; //do indeksowania linii w menu int j=0; //do indeksowania linii w nowo tworzonym menu int temat=0; while(i<opcji) { if( int(opcje[i][0])!=9 && i!=0 ) temat++; if(temat == wybor) { if(is_int_convert(opcje[i])) { str_wybor = "z"; //jeżeli ktoś wybierze już opcję, która jest podstawowa (nie ma dla niej podmenu) //to dokonał wyboru (zatwierdził mimo iż nie kliknął z) } opcje[j]=opcje[i]; j++; i++; while( int(opcje[i][0])==9 ) { opcje[j]=opcje[i].erase(0,1); j++; i++; } opcji=j; j=0; } i++; } } }
Gdy zrobiłem to w dll-ce to wygląda mniej więcej tak:
Menu* DLL_EXPORT CreateObjectMenu(int o, int t, string *op, string *tem, HWND ok, HWND l, HINSTANCE uchwyt) { return new Menu(o, t, *op, *tem, ok, l, uchwyt); }
Jednak w ten sposób nie działa. A jak zrobię tak:
Menu* DLL_EXPORT CreateObjectMenu(int o, int t, string *op, string *tem, HWND ok, HWND l, HINSTANCE uchwyt) { return new Menu(o, t, op, tem, ok, l, uchwyt); }
to wyświetla się błąd, że nie można przekonwertować ze string* na string.
Ma ktoś jakiś pomysł jak sobie sprytnie poradzić z tymi wskaźnikami?