Was ist das für ein Fehler
-
"Geht nicht" ist keine Fehlerbeschreibung. Es sollte aber so gehen:
#include <atlconv.h> char *var1 = "Hello World!"; LPCWSTR var2 = A2BSTR(char_string);
-
Klasse Danke für die Antworten mitten in der Nacht.
Aber ich will doch nicht den String "Blablabla" umwandeln, sondern den Text aus dem Eingabe feld, also bei mir muss da rein stat blablabla textBox1->Text, und das geht nicht.
Danke schon mal für deinen mühen.
-
Als was liegt textBox1->Text denn vor? Falls es ein char ist:
#include <atlconv.h> LPCWSTR var2 = A2BSTR(textBox1->Text); ::HWND hwnd(::FindWindow(NULL, var2));Bei einem std::string:
#include <atlconv.h> LPCWSTR var2 = A2BSTR(textBox1->Text.c_str()); ::HWND hwnd(::FindWindow(NULL, var2));Ansonsten bitte mehr Informationen
.
-
Du bist der Hammer

hier mal der Code ausschnitt:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { LPCWSTR var2 = A2BSTR(textBox1->Text.c_str()); ::HWND hwnd(::FindWindow(NULL, var2)); // HWND hWnd = FindWindow(NULL, textBox1->Text); // Draco II fast - 1/2 Play Money - No Limit Hold'em //HWND hWnd = FindWindow(NULL, (L"Calculator")); //const ::HWND hWnd(::FindWindow(NULL, (L"Rechner"))); if (hWnd != NULL && ::IsWindow(hWnd) == TRUE) mouse_event(MOUSEEVENTF_ABSOLUTE, 20, 20, NULL, NULL); //SetWindowText(hWnd,(L"Hallo")); //SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 800, 573, SWP_FRAMECHANGED); //MoveWindow (hWnd, 0, 0, 500, 300, TRUE); //textBox2->Text = (textBox1->Text + " JUHU"); else textBox2->Text = (textBox1->Text + " nicht da"); } };und hier die fehlermeldungen:
C3641: "InterlockedExchangePointer": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(102) : error C3641: "ATL::_AtlGetConversionACP": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(535) : error C3641: "AtlA2WHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(554) : error C3641: "AtlW2AHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(572) : error C3641: "AtlA2WHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(577) : error C3641: "AtlW2AHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(530) : error C3641: "AtlDevModeW2A": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>Das Buildprotokoll wurde unter "file://d:\Programmierung\FindWindowTest\FindWindowTest\Debug\BuildLog.htm" gespeichert.Danke
-
Kóyaánasqatsi schrieb:
Als was liegt textBox1->Text denn vor?
Vermutlich als System::String^
Sprich: .NET
@MJAEGER:
Du bist im falschen Forum. Da du ganz eindeutig C++/CLI machst, und das Problem auch mit einem .NET Typen ist (System::String), gehört die Frage entsprechend ins C++/CLI Forum.In der dortigen FAQ findest du auch gleich die Lösung:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-158664.htmlMit VS2008 geht es z.B. so:
#include <msclr/marshal.h> #include <msclr/marshal_cppstd.h> class ... { //... private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { msclr::interop::marshal_context mc; HWND hWnd = FindWindow(NULL, mc.marshal_as<const TCHAR*>(textBox1->Text)); if (hWnd != NULL && ::IsWindow(hWnd) == TRUE) { mouse_event(MOUSEEVENTF_ABSOLUTE, 20, 20, NULL, NULL); // ... } else textBox2->Text = (textBox1->Text + " nicht da"); } //... };
-
Das liegt an deinen Kompiliereinstellungen und hat mit der impliziten Konvertierung nichts zu tun. Kommst du zufälligerweise aus der JAVA-Ecke? Weil es meines Wissens nach keine Methoden-Definition einer Klasse mit dem Schlüsselwort "private" gibt. Außerdem sieht die Parameterliste:
(System::Object^ sender, System::EventArgs^ e)in meinen Augen komisch aus. Ich würde mal sagen, entweder alles zwischen den geschweiften Klammern auskommentieren und schauen ob die Meldungen dann immer noch kommen (falls ja, lag es nicht an der Konvertierung und dem rest des Codes) oder mal alles bei www.codepad.org hochladen, wenn es denn nicht zu viel ist.
-
Kóyaánasqatsi schrieb:
Weil es meines Wissens nach keine Methoden-Definition einer Klasse mit dem Schlüsselwort "private" gibt.
Also DAS ist noch ganz normales C++:
class foo { public: void bar1(); private: void bar2(); private: void bar3(); // geht so natürlich auch, nach public/protected/private muss nicht unbedingt ein Zeilenumbruch kommen };Außerdem sieht die Parameterliste:
(System::Object^ sender, System::EventArgs^ e)in meinen Augen komisch aus.
Das ist ganz normales C++/CLI.
-
Ja das ist in .net, ich dachte das wäre toll. Aber es ist nur ein Test Programm ich kann das noch ändern, was ich wohl tun werde, wenn ich schon sehe was es für eine Aktion ist die Eingabe zu ändern. Sollte ich es dann um es einfache zu haben mit MFC oder als Win32 Anwendung schreiben?
Danke schon mal.
-
hustbaer schrieb:
class foo { public: void bar1(); private: void bar2(); private: void bar3(); // geht so natürlich auch, nach public/protected/private muss nicht unbedingt ein Zeilenumbruch kommen };Ja, dass das geht wusste ich auch noch. Allerdings sah es bei ihm so aus, als würde eher die Methode außerhalb der Klasse definieren. Und das hatte ich so noch nie gesehen.
Zu dem ^:
Ich konnte mir in diesem Kontext nicht klar machen, weswegen man heir eine exklusive ODER-Verknüpfung braucht.
-
MJAEGER schrieb:
Ja das ist in .net, ich dachte das wäre toll. Aber es ist nur ein Test Programm ich kann das noch ändern, was ich wohl tun werde, wenn ich schon sehe was es für eine Aktion ist die Eingabe zu ändern. Sollte ich es dann um es einfache zu haben mit MFC oder als Win32 Anwendung schreiben?
Danke schon mal.
Also das kann dir keiner so genau sagen. Für alle API's/Zusätze brauchst du ein grundlegendes Verständniss. Letztendlich musst du selber entscheiden was und womit du entwickeln möchtest. Win32 sollte jedoch der richtige Weg sein...
-
Naja, das .NET gedöns ist sehr cool für GUI Sachen, das wird mit der MFC nur aufwendiger, und mit "roher" WinAPI erst recht.
Natürlich ist es bei C++/CLI etwas doof, wenn man oft Brücken zu unmanaged Funktionen schlagen muss. (Allerdings immer noch angenehmer als in C#)
Ich würde zwar auch von C++/CLI abraten, aber aus einem anderen Grund.
Und zwar weil C++/CLI eine viel komplexere, und daher viel "anfängerfeindlichere" Sprache ist. Verglichen mit "reinem" C++. Und erst recht verglichen mit C#. Man kann in C++/CLI einfach viel mehr aus Unwissenheit falsch machen. Und auch die Art von Fehlern, die nicht sofort auftreten, sondern erst irgendwann mal, und auch nicht leicht zu finden sind.
Sollte ich es dann um es einfache zu haben mit MFC oder als Win32 Anwendung schreiben?
Pfuh. Wenn du mit beiden noch keine/wenig Erfahrung hast, sind beide nicht einfach. .NET mit C# ist IMO für (Windows-) GUIs im Moment das Werkzeug der Wahl. Bloss in C# ist es eben - wie schon angedeutet - nochmal ein Stück lästiger mit der "unmanaged" Welt zu kommunizieren.
-
Kóyaánasqatsi schrieb:
Zu dem ^:
Ich konnte mir in diesem Kontext nicht klar machen, weswegen man heir eine exklusive ODER-Verknüpfung braucht.Ja sowas dachte ich mir schon. Die Lösung: in diesem Kontext ist es kein XOR, sondern zeigt an, dass es sich um eine "managed reference" handelt. Das .NET Gegenstück zu einem C++ Zeiger bzw. shared_ptr sozusagen.
MJAEGER schrieb:
wenn ich schon sehe was es für eine Aktion ist die Eingabe zu ändern
Die Eingabe ändern ist überhaupt keine Action, das ist total trivial. Einfacher wird's mit keinem GUI-Toolkit. Doof sind nur die Stellen wo "managed" (Forms, System::String etc.) und "unmanaged" (FindWindow, ...) zusammentrifft.
-
Ihr seid Spitze.
hustbaer
Dein Code funktionieret. Ich weiss zwar nicht was der macht aber es funzt.
Ich werde noch ein paar sachen ausprobieren und dann noch etwas mehr lernen. Ich weiss nur immer noch nicht wie ich es programmieren soll.
Also es wird ein Programm, das aus den Fenstern eines anderen Programmes (mehrere) per OCR (also DLL einbinden) daten ausliest diese verarbeitet und dann die maus in die Fenster schickt und dort bestimmte buttons zu drücken. die Dll ist fertig, also die hat jemand anderes programmiert ich greife nur drauf zu und brauche natürlich für mein Programm ein GUI dachte mache das mit C++ .net aber das eine ist ja managed und das andere nicht, also ist .net eher kompliezierter. Was mache ich am besten.
Danke euch
-
hustbaer schrieb:
Kóyaánasqatsi schrieb:
Zu dem ^:
Ich konnte mir in diesem Kontext nicht klar machen, weswegen man heir eine exklusive ODER-Verknüpfung braucht.Ja sowas dachte ich mir schon. Die Lösung: in diesem Kontext ist es kein XOR, sondern zeigt an, dass es sich um eine "managed reference" handelt. Das .NET Gegenstück zu einem C++ Zeiger bzw. shared_ptr sozusagen.
Toll, von dir lernt man immer wieder was
.