[C++] Probleme mit PixelSearch

03/20/2012 00:19 » Fabi202cool#1
moin,
ich versuche nun schon seit einigen Stunden ein PixelSearch von meiner DLL zu starten. Aber irgendwie will nichts in der DLL klappen, wie z.B. die PixelSearch Funktion aus der AutoIt Lib:

Quote:
#include <Windows.h>
#include "AutoIt3.h"

BOOL WINAPI DllMain(HINSTANCE hDllInstance, DWORD Reason, LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
POINT T;
AU3_Sleep(1000);
AU3_PixelSearch(0,0,10,10,0xFF0000,10,10,&T);
if (AU3_error() == 0)
{
AU3_MouseMove(T.x,T.y,NULL);
}
break;
}
return TRUE;
}
Bei einer normalen Anwendung geht alles, bei der DLl jedoch nichts. Hat von euch vll jemand eine vernünftige PixelSearch Funktion die auch bei DLL's geht, oder kann mir helfen?
03/20/2012 11:52 MoepMeep#2
Hör bitte auf eine so schöne Sprache mit AutoIt und PixelSearch zu vergewaltigen, danke.
03/20/2012 12:27 KDeluxe#3
Theoretisch könntest du die PixelSearch Funktion kopieren.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
03/20/2012 13:44 xNopex#4
Quote:
Bei einer normalen Anwendung geht alles, bei der DLl jedoch nichts.
Deine Fehlerbeschreibung hilft so ziemlich gar nicht. Was genau geht nicht? Was passiert genau? Schonmal geschaut, ob der Code überhaupt ausgeführt wird? Bzw. mal rausgekriegt, wo genau nicht das erwartete Verhalten eintrifft? Sollen wir jetzt ins Blaue raten, was falsch läuft? Solche Themen kotzen mich einfach an. Fetzen Code hinwerfen rumheulen, dass es nicht geht und die Anderen machen lassen.. Blabla geh weiter in AutoIt scripten.
03/20/2012 14:43 » Fabi202cool#5
Quote:
Originally Posted by MoepMeep View Post
Hör bitte auf eine so schöne Sprache mit AutoIt und PixelSearch zu vergewaltigen, danke.
AutoIt ist in C++ geschrieben und bei der AU3_ wird direkt die Funktion aus der DLL geladen.

Quote:
Originally Posted by KDeluxe View Post
Theoretisch könntest du die PixelSearch Funktion kopieren.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
Danke, teste die Funktion gerade.

Quote:
Originally Posted by xNopex View Post
Deine Fehlerbeschreibung hilft so ziemlich gar nicht. Was genau geht nicht? Was passiert genau? Schonmal geschaut, ob der Code überhaupt ausgeführt wird? Bzw. mal rausgekriegt, wo genau nicht das erwartete Verhalten eintrifft? Sollen wir jetzt ins Blaue raten, was falsch läuft? Solche Themen kotzen mich einfach an. Fetzen Code hinwerfen rumheulen, dass es nicht geht und die Anderen machen lassen.. Blabla geh weiter in AutoIt scripten.
Wenn ich schreibe das nichts passiert wird die Funktion nicht ausgeführt, außerdem ahbe ich noch vergessen hinzuschreiben das die Gesammte DLL bei diesem Punkt stoppt.
03/20/2012 14:56 jacky919#6
Versuch doch die Funktionen via LoadLibary zu laden.
03/20/2012 16:51 xNopex#7
Quote:
Wenn ich schreibe das nichts passiert wird die Funktion nicht ausgeführt, außerdem ahbe ich noch vergessen hinzuschreiben das die Gesammte DLL bei diesem Punkt stoppt.
Es ist sehr unklug (zeit-)aufwendige Funktionen in die DLL-Main zu platzieren. Allgemein sollte es vermieden werden in der DllMain Code ausführen zu lassen. Deshalb: Starte in der DllMain einen Thread und lass den Thread die PixelSearch-Funktion aufrufen.
03/20/2012 18:07 » Fabi202cool#8
Quote:
Originally Posted by xNopex View Post
Es ist sehr unklug (zeit-)aufwendige Funktionen in die DLL-Main zu platzieren. Allgemein sollte es vermieden werden in der DllMain Code ausführen zu lassen. Deshalb: Starte in der DllMain einen Thread und lass den Thread die PixelSearch-Funktion aufrufen.
Jo, habe es so hier in epvp gepostet damit es übersichtlicher ist.

Habe es jetzt mit der Original Autoit Funktion getestet, jedoch mit dem selben Ergebniss...

03/20/2012 19:18 xNopex#9
Du hast zwei Möglichkeiten:
Entweder du gehst mit einem Debugger drüber und schaust, wo und warum etwas schief läuft. Oder du setzt an interessanten Punkten ein paar Ausgaben, z.b. via OutputDebugString, und schaust so, wo genau der Fehler liegt. Und dann kann man weiter sehen.
03/20/2012 19:44 Nightblizard#10
Quote:
Originally Posted by xNopex View Post
Es ist sehr unklug (zeit-)aufwendige Funktionen in die DLL-Main zu platzieren. Allgemein sollte es vermieden werden in der DllMain Code ausführen zu lassen. Deshalb: Starte in der DllMain einen Thread und lass den Thread die PixelSearch-Funktion aufrufen.
Selbst das kann zum Deadlock führen, wenn man nicht aufpasst. Allgemein sollte man keinen fremden Code ausführen, der nicht aus der Kernel32.dll stammte.
Genaueres dazu:
[Only registered and activated users can see links. Click Here To Register...]

Schlauer ist es eine Funktion aus der Dll zu exportieren und diese dann in deinem Programm zu importieren. Hier kann nichts schief gehen (eigene Dummheit mal ausgeschlossen)!

Beispiel:
Code:
//Meine Dll

bool __declspec(dllexport) PixelSearch()
{
       //...
}
Code:
//Meine Exe

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

bool __declspec(dllimport) PixelSearch();

int main()
{
     PixelSearch();
}
Besser geht es nicht. Das Ganze ist dann auch nochmal schneller als die Dll über LoadLibrary zu laden und ihre Funktionen zur Laufzeit zu importieren. Hier übernehmen der Compiler und am Ende der PE Loader die Schmutzarbeit.




@Topic:
Du solltest dir die Funktionen BitBlt und CreateDIBSection anschauen, dann kannst du das auch ohne AutoIt machen.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]