HWND von c.dll(programm) zu c++.dll zu CreateWindowEx(hwnd)
-
hi sorry für meine schreibfehler und so. ich bin ein belesener legastheniker^^
ich bin ein richtiger c++ anfänger und bin gerade an einen projekt dran.ich will nen fenster(childwindow?) in nen fenster von nem programm machen. das programm läuft auf c und hat eine offene programierumgebung.
ich kann durch nen dll export:
"C" __declspec(dllexport)
nen winapi fenster mit einer °°C°° datei öffnen. leider ist das fenster ungebunden. d.h. es ist ein normales windows fenster. ich wills aber im programm einbinden. dafür brauche ich den HWND.
ich kenn mich leider jetzt nicht so mit dem hin und her senden von daten der dlls
und den umwandeln von z.B. int zu HWND, void zu HWND, HWND(HWAND)zu HWND aus.
so zu meiner frage wie bekomme ich die abrufbare °C° HWND in die °°C++°°.dll und dann noch in die CreateWindowEx() funktion rein?
ich bin schon seit ner woche am googeln doch finde die lösung nicht.
ich wollte es in der °C++°.dll mit
extern "C" __declspec(dllexport)HWND find(HWND find2);
versuchen die werte hab ich auch gegen int long void und ka was alles noch in diversen kombinationen getesten doch CreateWindowEx() sagt es wäre keine HWND dan.. und gibt nen compiler error.
so konnt eich auch nicht in der °C°.dll
#improt "c.dll" void find(int); #import
testen.
helft mir bitte und keine cryptischen antworten ich bin echt nen anfänger, also gebt mir nen code!!!!
hier noch mal compiler meldungen zum CreateWindowEx() problem:
Error C2664 'HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)' : cannot convert argument 9 from 'HWND (__cdecl *)(HWND)' to 'HWND' Error (active) E0167 argument of type "HWND (*)(HWND)" is incompatible with parameter of type "HWND"
-
Die Fehlermeldung ist aber eindeutig - du rufst CreateWindowEx mit einem falschen Parameter auf, anscheinend
CreateWindowEx(..., find, ...) // hier übergibst du einen Funktionszeiger
Wie bekommst du denn das HWND aus dem C-Programm übergeben? Denn die find()-Funktion macht ja so keinen Sinn, wenn du ein HWND als Parameter reingibst um dann wiederum das HWND zurückzubekommen.
Und diesen HWND-Parameter kannst du dann einfach direkt verwenden:
HWND hWnd = ...; CreateWindowEx(..., hWnd, ...)
PS: Sollen die ° in deinem Beitrag Hochkommata (' oder ") sein?
-
die °° zeichen benutze ich für eine bessere übersicht.
das mit dem übergeben hab ich noch nicht gemacht, weil ich es noch nicht mit dem
CreateWindowEx() hinbekommen habe. das mit der void find(int); habe ich von nen anderen forum:
https://www.mql5.com/en/forum/127207The other thing which isn't clear is why, having got a window handle in int form, you're not just simply casting it to a HWND. For example, there's no problem doing the following in MT4...
#import "whatever.dll" void PassTheWindowHandle (int ResultFromWindowHandleFunction); #import
... and declaring the function in C as:
void PassTheWindowHandle (HWND ResultFromWindowHandleFunction)
hier ist noch nen anderer forumsbeitrag:http://stackoverflow.com/questions/21422106/how-to-pass-window-handle-to-c-win32-dll-from-c-sharp
To pass the handle, you can add another function in C++ end. Something like, (in the header) extern "C" __declspec(dllexport) void SetParent(HWND hWnd);
damit kann ich in der °C°.dll den HWND ermitteln;
WindowHandle( Symbol(), Period());
das °C°programm ist ein börsenchartprogramm namens metatrader 4 mit einer auf °C° basierenden programmiersprache namens mql4.
ich will
WindowHandle( Symbol(), Period());
in in die °C++°.dll reinbekommen bzw. den HWND vom °C° in die CreateWindowEx().
das HWND hWnd = ...; ist schon für meine CreateWindowEx() definiert:
hWnd = CreateWindowEx(NULL,(LPCWSTR)(szClassName),(LPCWSTR)(L"Das erste Fenster!"),WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT,300, 250,find,NULL,hInst,NULL);
ich habs jetzt mal so getestet:
HWND find2; extern "C" __declspec(dllexport) HWND find=find2;
andere kombinatioen haben nen compiler error ergeben.
doch in °C° will er das nicht icht habent..
#import "mt4 test minimalistisch.dll" int find; //int Win(); damit starte ich das fenster #import //das will er auch nicht... #import "mt4 test minimalistisch.dll" int find=find2; //int Win(); damit starte ich das fenster #import
bei beiden sagt er dann der import kann nicht geschlossen werden..
int find(int);
z.B. nimmt er ohne zu mucken an.
ich hab schon über 2 tage mit googeln verbracht finde oder verstehe die lösung nicht... und googeln gehört zu meinen stärken nur nach was soll ich suchen? ich habe sogar heute morgen davon geträumt und die lösung gesucht^^
-
...dieser Beispiel kann dir weiter helfen:
https://www.codeproject.com/Articles/18724/Hosting-exe-applications-into-a-dialog