Konwersja wchar_t* do string'a

0

Witam!
Przesiadam się właśnie z C# na C++ i przyznaję, że jest to dużo trudniejsze, niż początkowo sądziłem. Googluję już kilka godzin, ale nie potrafię na podstawie znalezionych przykładów, rozwiązać swojego problemu. Do rzeczy.

Funkcja ma za zadanie pobrać tytuł aktywnego okna i wyświetlić go na labelu. Oto kod:

{
HWND Uchwyt = GetForegroundWindow();
int Dl = GetWindowTextLength(Uchwyt)+1;
wchar_t* Tytul;
GetWindowText(Uchwyt, Tytul, Dl);
label1->Text = Tytul;
}

Oczywiście wyskakuje błąd *cannot convert parameter 1 from 'wchar_t ' to 'System::String ^' Nie mam pojęcia jak przekonwertować ten Tytul, aby wyświetlił się jako label1->Text.

Pozdrawiam.

0

eee jak to googlujesz kilka godzin...
odpowiedź jest w pierwszym linku dla zapytania convert wchar_t to system string: http://msdn.microsoft.com/en-us/library/ms235631%28v=vs.80%29.aspx

BTW: to nie jest C++, a C++\CLI - to jest spora różnica

0

Widziałem już i próbowałem w.g. instrukcji na stronie:

{
HWND Uchwyt = GetForegroundWindow();
int Dl = GetWindowTextLength(Uchwyt)+1;
wchar_t* Tytul;
GetWindowText(Uchwyt, Tytul, Dl);
String ^systemstring = gcnew String(Tytul);
label1->Text = systemstring;
delete systemstring;
}

Dostaję błędy:

1>  Processing resource file "Form1.resX" into "Debug\testcli.Form1.resources".

1>test cli.obj : error LNK2028: unresolved token (0A000012) "extern "C" int __stdcall GetWindowTextW(struct HWND__ *,wchar_t *,int)" (?GetWindowTextW@@$$J212YGHPAUHWND__@@PA_WH@Z) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>test cli.obj : error LNK2028: unresolved token (0A000013) "extern "C" int __stdcall GetWindowTextLengthW(struct HWND__ *)" (?GetWindowTextLengthW@@$$J14YGHPAUHWND__@@@Z) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>test cli.obj : error LNK2028: unresolved token (0A000014) "extern "C" struct HWND__ * __stdcall GetForegroundWindow(void)" (?GetForegroundWindow@@$$J10YGPAUHWND__@@XZ) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>test cli.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall GetWindowTextW(struct HWND__ *,wchar_t *,int)" (?GetWindowTextW@@$$J212YGHPAUHWND__@@PA_WH@Z) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>test cli.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall GetWindowTextLengthW(struct HWND__ *)" (?GetWindowTextLengthW@@$$J14YGHPAUHWND__@@@Z) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>test cli.obj : error LNK2019: unresolved external symbol "extern "C" struct HWND__ * __stdcall GetForegroundWindow(void)" (?GetForegroundWindow@@$$J10YGPAUHWND__@@XZ) referenced in function "private: void __clrcall testcli::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@testcli@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>C:\Documents and Settings\ogryz\Pulpit\VSC\test cli\test cli\Debug\test cli.exe : fatal error LNK1120: 6 unresolved externals

Pozdrawiam.

0

Błąd jest gdzieś indziej.

Poza tym:

  1. nie alokujesz miejsca dla tego co ma pobrać GetWindowText - piszesz po pamięci tam gdzie nie powinieneś i jak się przyfarci to program się wysypie.
  2. po co używasz delete na systemstring? Wiesz co to C++\CLI, garbage collector?
0

Ok, problemy już rozwiązane :)

ad 0) Problem linkera rozwiązałem, dodając

#pragma comment (lib, "user32.lib")

po #include <windows.h>


ad 1) Czy teraz jest poprawnie?
```cpp
HWND Uchwyt = GetForegroundWindow();
int Dl = GetWindowTextLength(Uchwyt)+1;
wchar_t* Tytul = new wchar_t[Dl];
GetWindowText(Uchwyt, Tytul, Dl);
String ^systemstring = gcnew String(Tytul);
label1->Text = systemstring;
delete systemstring;

ad2) O "garbage collector" nie słyszałem, ale po nazwie domyślam się, do czego służy. Automat zwalniający nieużywaną pamięć?

Pozdrawiam.

0

Nie, nie jest do końca poprawnie, ale przynajmniej się nie posypie.
Skoro nie wiesz co to garbage collector to nie wiesz też nic o .Net, którego używasz. No i nie znasz też C#. Pisanie w C++\CLI(którego też nie znasz) bez znajomości .Net i C# skończy się tylko błędem na błędzie.

HWND Uchwyt = GetForegroundWindow();
int Dl = GetWindowTextLength(Uchwyt)+1;
wchar_t* Tytul = new wchar_t[Dl];
GetWindowText(Uchwyt, Tytul, Dl);
String ^systemstring = gcnew String(Tytul);
label1->Text = systemstring;
delete [] Tytul;

Przy okazji, mieszasz konwencje nazewnicze, mieszasz język polski z angielskim - tak się nie robi, to bardzo utrudnia życie.

No, ale nie od razu Rzym zbudowano ;)

0

Dzięki byku_guzio za cierpliwą pomoc. To moje pierwsze starcie z Visual C++. Teraz zabieram się za książki i podstawy :)

Pozdrawiam.

P.S. Polskie nazewnictwo było tu celowe, ponieważ ułatwia mi zrozumienie języka. Na co dzień nie stosuję tego.

P.S.2 Nie wiem gdzie kliknąć podziękowanie, o ile taki system istnieje na forum.

0

String ^systemstring = gcnew String(Tytul);
label1->Text = systemstring;

Ale po co tak komplikować?

label1->Text = gcnew String(Tytul);

1 użytkowników online, w tym zalogowanych: 0, gości: 1