Mousehook



  • Hallo,
    ich befasse mich im Moment mit dem Mousehook; Dazu habe ich folgendes Tutorial gefunden:
    http://www.tutorials.de/forum/c-c-tutorials/164662-tutorial-ueber-windows-hooks.html

    Wenn ich den Code vom Tutorial übernehme, bis auf ein paar Stellen, habe ich als dll.h:

    #ifndef _DLL_H_
    #endif  /*von mir ergänzt*/
    #define _DLL_H_
    
    #include <windows.h>
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else
    # define DLLIMPORT __declspec (dllimport)
    #endif
    
    #pragma data_seg ("shared")
    int i_MyGlobalSharedVariable = 0;
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:shared,RWS")
    
    DLLIMPORT BOOL InstallHook();
    DLLIMPORT BOOL UninstallHook();
    
    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    und als dllmain.cpp:

    #include "dll.h"
    
    HHOOK g_hMouseHook /*SHARED*/ = NULL; /*steht zwar im Tutorial, ist aber anscheinend falsch*/
    HINSTANCE g_hInst /*SHARED*/ = NULL;
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
    	g_hInst = hInst;
    	return TRUE;
    }
    
    DLLIMPORT BOOL InstallHook()
    {
    	if(g_hMouseHook != NULL)
    		return TRUE;
    
    	g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
    	if(g_hMouseHook == NULL)
    		return FALSE;
    
    	return TRUE;
    }
    
    DLLIMPORT BOOL UninstallHook()
    {
    	if(g_hMouseHook != NULL)
    	{
    		UnhookWindowsHookEx(g_hMouseHook);
    		g_hMouseHook = NULL;
    	}
    	return TRUE;
    }
    
    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode < 0)
    		return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    
    	if(nCode == HC_ACTION)
    	{
    		if((wParam == WM_LBUTTONDOWN) || (wParam == WM_NCLBUTTONDOWN))
    		{
    			MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam;
    			HWND caller = FindWindow("Pipette", NULL);
    			if(caller != NULL)
    				PostMessage(caller, WM_USER+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y));
    		}
    	}
    	return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    }
    

    Wenn ich das nun kompiliere bekomme ich folgende Fehler:
    c:\...\dllmain.cpp(13) : error C2491: 'InstallHook': Definition von Funktion für dllimport nicht zulässig
    c:\...\dllmain.cpp(25) : error C2491: 'UninstallHook': Definition von Funktion für dllimport nicht zulässig
    c:\...\dllmain.cpp(44) : error C2664: 'FindWindowW': Konvertierung des Parameters 1 von 'const char [8]' in 'LPCWSTR' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Wäre schön, wenn mir jemand weiterhelfen könnte, oder eine Idee hat, wie ich das in den Griff bekomme ;).



  • Hi,

    hast du denn BUILDING_DLL beim Bauen der DLL in den Compiler-Optionen gesetzt? Alternativ kannst du ein #define BUILDING_DLL vor #include "dll.h" in der dllmain.cpp setzen. Du solltest aber auch #if BUILDING_DLL umschreiben zu #ifdef BUILDING_DLL .
    Es geht darum, dass in deiner dllmain.cpp DLLIMPORT vor den Funktionsdefinitionen durch __declspec (dllexport) ersetzt wird. Und das wird es nur, wenn BUILDING_DLL "gesetzt" ist.
    Mit #ifdef prüfst du übrigens, ob ein Symbol gesetzt ist. Mit #if kannst du z.B. Wertvergleiche durchführen ( #if XYZ == 7 ).

    Zwei andere Punkte:
    Das von dir ergänzte #endif in der Header-Datei sollte ganz ans Ende der Datei. Das Konzept nennt sich "Include Guards", falls du danach googeln (oder yahoo'n) willst.

    Viele Funktionen liegen in der WinAPI in einer Unicode- und einer ASCII-Version vor, auch FindWindow ; die Funktionen heißen entsprechend FindWindowW und FindWindowA . Je nachdem, ob du in den Compiler-Optionen das UNICODE-Flag gesetzt hast, wird FindWindow durch den Präprozessor durch eine der beiden Versionen ersetzt. FindWindowW verlangt einen Unicode-String (z.B. L"Hallo" ), FindWindowA einen ASCII-String (z.B. "Hallo" ). Für deinen FindWindow -Aufruf kannst du dir eine Vorgehensweise aussuchen:

    FindWindowA("Pipette", NULL)
    FindWindowW(L"Pipette", NULL)
    FindWindow(TEXT("Pipette"),NULL)  //<- zu empfehlen
    


  • hi,

    @ Badestrand: Vielen Dank für deine Hinweise! Damit konnte ich meine .dll ohne Probleme erstellen.
    Jetzt arbeite ich gerade am "Hauptprogramm"; Wieder habe ich den Code aus dem Tutorial übernommen und hier und da etwas ergänzt.
    Hier der Code: main.h:

    #include <windows.h>
    #include <stdio.h>
    
    /*defines*/
    
    #define WINDOW_WIDTH 310
    #define WINDOW_HEIGHT 200
    
    #ifndef GET_X_LPARAM
    #define GET_X_LPARAM(lp)  ((int)(short)LOWORD(lp))
    #endif
    #ifndef GET_Y_LPARAM
    #define GET_Y_LPARAM(lp)  ((int)(short)HIWORD(lp))
    #endif
    
    typedef bool (CALLBACK *MYFUNC)(void);
    
    /*Prototypen*/
    
    void Init();
    void DrawColor(POINT &p, HWND &mainWindow);
    void DrawDialog(HWND &parent, HINSTANCE &inst);
    void ToHTML();
    void ToRGB();
    bool IsPointInApp(POINT &p, HWND &mainWindow);
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*Globale Variablen*/
    
    MYFUNC InstallHook;
    MYFUNC UninstallHook;
    
    HWND hInstallHookBtn;
    HWND hUninstallHookBtn;
    HWND hEditRGB;
    HWND hEditHTML;
    HWND hStaticFrame;
    
    COLORREF col;
    RECT ColorRect;
    
    char szClassName[ ] = "Pipette";
    

    und main.cpp:

    #include "main.h"
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
    					HINSTANCE hPrevInstance,
    					LPSTR lpszArgument,
    					int nFunsterStil)
    {
    	HWND hwnd;
    	MSG messages;
    	WNDCLASSEX wincl;
    
    	Init();
    
    	/*The window structure*/
    
    	wincl.hInstance = hThisInstance;
    	wincl.lpszClassName = szClassName;
    	wincl.lpfnWndProc = WindowProcedure;
    	wincl.style = CS_DBLCLKS;
    	wincl.cbSize = sizeof (WNDCLASSEX);
    
    	/*Use default icon and mouse-pointer*/
    
    	wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    	wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wincl.lpszMenuName = NULL;
    	wincl.cbClsExtra = 0;
    	wincl.cbWndExtra = 0;
    	wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    	/*Register the window class, and if it fails quit the program*/
    
    	if(!RegisterClassEx (&wincl))
    		return 0;
    
    	/*The class is registered, let's create the prgram*/
    
    	hwnd = CreateWindowExA(
    						  0,
    						  szClassName,
    						  "Pipette",
    						  WS_SYSMENU|WS_MINIMIZEBOX,
    						  CW_USEDEFAULT,
    						  CW_USEDEFAULT,
    						  WINDOW_WIDTH,
    						  WINDOW_HEIGHT,
    						  HWND_DESKTOP,
    						  NULL,
    						  hThisInstance,
    						  NULL
    						  ); //CreateWindowA von mir ergänzt
    
    	DrawDialog(hwnd, hThisInstance);
    
    	/*Make the window visible on the screen*/
    
    	ShowWindow (hwnd, nFunsterStil);
    
    	HINSTANCE hDLL = LoadLibraryA("mousehook.dll"); //LoadLibraryA von mir ergänzt
    	if(hDLL == NULL)
    	{
    		MessageBoxA(NULL, "Fehler beim Laden der DLL: mousehook.dll", "Fehler", MB_OK); //MessageBoxA von mir ergänzt
    		return FALSE;
    	}
    
    	InstallHook = (MYFUNC) GetProcAddress(hDLL, "InstallHook");
    	if(InstallHook = NULL)
    	{
    		MessageBoxA(NULL, "Fehler: InstallHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
    		return FALSE;
    	}
    
    	UninstallHook = (MYFUNC) GetProcAddress(hDLL, "UninstallHook");
    	if(UninstallHook == NULL)
    	{
    		MessageBoxA(NULL, "Fehler: UninsatllHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
    		return FALSE;
    	}
    
    	/*Run the message loop. It will run until GetMessage() returns 0*/
    	while(GetMessage(&messages, NULL, 0, 0))
    	{
    		/*Translate virtual-key messages into character messages */
    		TranslateMessage(&messages);
    		/*Send message to WindowProcedure */
    		DispatchMessage(&messages);
    	}
    
    	/* The program return-value is 0 - The value that PostQuitMessage() gave*/
    	FreeLibrary(hDLL);
    	return messages.wParam;
    }
    
    void Init()
    {
    	InstallHook = NULL;
    	UninstallHook = NULL;
    
    	hInstallHookBtn = NULL;
    	hUninstallHookBtn = NULL;
    	hEditRGB = NULL;
    	hEditHTML = NULL;
    	hStaticFrame = NULL;
    
    	col = RGB(0,0,0);
    	ColorRect.left = 10;
    	ColorRect.top = 120;
    	ColorRect.right = 290;
    	ColorRect.bottom = 160;
    }
    
    void DrawDialog(HWND &parent, HINSTANCE &inst)
    {
    	hInstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 10, 10, 120, 30, parent, 0, inst, 0); //CreateWindowA von mir ergänzt
    	SetWindowTextA(hInstallHookBtn, "Install Hook"); //SetWindowTextA von mir ergänzt
    	hUninstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 170, 10, 120, 30, parent, 0, inst, 0);
    	SetWindowTextA(hUninstallHookBtn, "Uninstall Hook");
    
    	HWND tmp;
    	tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 60, 100, 18, parent, 0, inst, 0);
    	SetWindowTextA(tmp, "RGB Farbe:");
    	tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 90, 100, 18, parent, 0, inst, 0);
    	SetWindowTextA(tmp, "HTML Farbe:");
    
    	hEditRGB = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 59, 100, 20, parent, 0, inst, 0);
    	hEditHTML = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 89, 100, 20, parent, 0, inst, 0);
    	//hStaticFrame = CreateWindow("STATIC", 0, WS_BORDER|WS_CHILD|WS_VISIBLE, 10, 120, 280, 40, parent, 0, inst, 0);
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HWND hBut;
    	static HBRUSH brush;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		if(HIWORD(wParam) == BN_CLICKED)
    		{
    			hBut = (HWND)lParam;
    			if(hBut == hInstallHookBtn)
    			{
    				BOOL ret = InstallHook();
    				if(ret == FALSE)
    					MessageBoxA(NULL, "InstallHook fehlgeschlagen", "Fehler", MB_OK);
    				else
    					SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_SHOWWINDOW);
    			}
    			else if(hBut == hUninstallHookBtn)
    			{
    				if(UninstallHook() == FALSE)
    					MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);
    			}
    		}
    		break;
    
    	case WM_USER+123:
    		POINT p;
    		p.x = GET_X_LPARAM(lParam);
    		p.y = GET_Y_LPARAM(lParam);
    		DrawColor(p, hwnd);
    		break;
    
    	case WM_PAINT:
    		PAINTSTRUCT ps;
    		brush = CreateSolidBrush(col);
    		HDC dc;
    		dc = NULL;
    		dc = BeginPaint(hwnd, &ps);
    		SelectObject(dc, brush);
    		FillRect(dc, &ColorRect, brush);
    		EndPaint(hwnd, &ps);
    		return 0;
    
    	case WM_DESTROY:
    		DeleteObject(brush);
    		if(!UninstallHook())
    			MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);
    
    		PostQuitMessage(0);
    		break;
    
    	default:
    		return DefWindowProc (hwnd, message, wParam, lParam);
    	}
    
    	return 0;
    }
    
    void DrawColor(POINT &p, HWND &mainWindow)
    {
    	HWND owner = WindowFromPoint(p);
    	if(owner)
    	{
    		HDC ownerDC = GetDC(owner);
    		if(ownerDC && !IsPointInApp(p, mainWindow))
    		{
    			ScreenToClient(owner, &p);
    			col = GetPixel(ownerDC, p.x, p.y);
    			ToHTML();
    			ToRGB();
    			InvalidateRect(mainWindow, &ColorRect, TRUE);
    		}
    	}
    }
    
    void ToHTML()
    {
    	char sHtml[8]; sHtml[0] = 0;
    	sprintf(sHtml, "#%.2X%.2X%.2X", GetRValue(col), GetGValue(col), GetBValue(col));
    	SetWindowTextA(hEditHTML, sHtml); //SetWindowTextA von mir ergänzt
    }
    
    void ToRGB()
    {
    	char sRGB[12]; sRGB[0] = 0;
    	sprintf(sRGB, "%d, %d, %d", GetRValue(col), GetGValue(col), GetBValue(col));
    	SetWindowTextA(hEditRGB, sRGB);
    }
    
    bool IsPointInApp(POINT &p, HWND &mainWindow)
    {
    	RECT rect;
    	GetWindowRect(mainWindow, &rect);
    
    	if(p.x >= rect.left &&
    		p.x <= rect.right &&
    		p.y >= rect.top &&
    		p.y <= rect.bottom)
    	{
    		return true;
    	}
    	else 
    		return false;
    }
    

    Wenn es jetzt unter den Standardeinstellunge kompiliere erhalte ich folgdenen Fehler:
    c:\...\main.cpp(17) : error C2440: '=': 'char [8]' kann nicht in 'LPCWSTR' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Nun habe ich allerdings im Forum gelesen, dass man in diesem Fall wohl nicht den Unicode Zeichensatz verwenden sollte.
    Also habe ich die Einstellung Zeichensatz auf "Nicht festgelegt" gesetzt.
    Damit konnte ich es kompilieren, allerdings mit vier Warnungen:
    c:\...\main.cpp(211) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(366): Siehe Deklaration von 'sprintf'
    c:\...\main.cpp(218) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(366): Siehe Deklaration von 'sprintf'

    Wenn ich jetzt die .exe ausführe, bekomme ich, wie im Tutorial beschrieben das Fenster. Wenn ich jetzt allerdings auf "Install Hook" klicke, bekomme ich folgende Fehlermeldung:
    Pipette.exe hat ein Problem festgestellt und muss beendet werden.
    Falls Sie Ihre Arbeit noch nicht gespeichert hatten, können Daten möglicherweise verloren gegangen sein.
    Für weitere Informationen zu diesem Fehler, [klicken Sie hier].

    Wäre schön, wenn mir noch einmal jemand helfen könnte oder mir sagen könnte warum dieser Fehler zu Stande kommt ;).

    P.S.: Ich benutze Visual C++ 2008 Express Edition.



  • hallo

    Versuche es mal mit pilzen .)
    Nein ,aber hooking ist nicht für anfänger.
    In msdn ist alles beschrieben. ! Mr. Jonny



  • hi schrieb:

    Versuche es mal mit pilzen .)

    Nicht lustig.

    @topic: In msdn habe ich auch schon gesucht, aber nichts gefunden, was mich weiterbringt. Ich lasse mich aber gerne vom Gegenteil überzeugen ;).

    Mein Probelm ist ja auch nicht mehr das Programm selber, d.h. (soweit ich es sehe) liegt es nicht mehr am Sourcecode, sondern an irgendetwas anderem. Meine Frage bezieht sich also auf die Fehlermeldung die ich bekomme, wenn ich auf "Install Hook" klicke.

    Weiß jemand eine Lösung, oder könnte mir zumindest sagen, ob es jetzt ein Problem/Fehler im Sourcecode ist, oder ob der Fehler ganz woanders liegt?



  • hi

    Klar liegt es an der Source !! Wen das Program abschmiert, ist meistens was in ein Speicherbereich kopiert worden der nicht gross genug ist. Also buffer/stack overflow oder formatstring etc... Schau mal was der Compiler sagt ! hast du Warnungen wen du compilierst? Mit hooks solltest du dich auskennen, da das zu schwerwiegenden Fehler im betrieb de OS kommen kann !

    LB



  • Hi

    So wie ich feststellen muss, gibt es immer wieder Personen die meinen sie können von einem toutorial den sourcecode übernehmen, und dan meinen es läuft alles rund. Anstat sich mit der Materie zu befassen! Dan würden auch nicht so dämliche fragen gestellt. Wer soll den das schon wissen was du für ein Problem hast. kannst nicht 300 zeilen code posten, und dan von den User hier erwarten das sie dir den Fehler suchen ! Ein bisschen eigeninitiative ist gefragt ! wen du wenigstens sagen würdest wo du den Fehler vermutest, dan wäre das etwas anderes. Und ich meine das du dich mal besser zuerst mit windows programmierung beschäftigst solltest ,anstat dich gleich mit hooks herumzuschlagen. weil so wird dir bestimmt niemand helfen.

    Cya LB



  • Hi,
    @0or1: Ok, das mit den 300 Zeilen Code ist richtig; Sorry dafür.
    Also, dann will ich es noch einmal versuchen (etwas kürzer):
    Ich übernahm den Code aus dem Tutorial und behob einen Großteil der Fehler, bis nur noch einer übrig war (und ja, ich habe mich auch mit der Materie auseinander gesetzt):

    c:\...\main.cpp(17) : error C2440: '=': 'char [8]' kann nicht in 'LPCWSTR' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Anscheinend liegt der Fehler, welcher den Programm-Absturz verursacht, hier.
    Also suchte ich im Forum eine Lösung und fand diesen Thread wo geschrieben wurde:

    windowclass.lpszClassName = szClassName;

    ...weist du einem Zeiger auf einen Unicodestring [wchar_t*] einen Ansi-String [char*] zu. In den Projekteinstellungen lässt sich die Unicodeunterstützung ein und ausstellen (Bei dir ist sie aktiv).

    und

    Wenn ich mich nicht irre ist das der Zeichensatz in den Projekteinstellungen (Unicode gegen ich glaube MCSB oder wie es heißt austauschen)...

    Also setzte ich meinen Zeichensatz auf "Nicht festgelegt" (da ich MCSB nicht habe) und schon ließ sich das Programm (bis auf zwei Warnungen, die ich aber behob) kompilieren. Der Programm-Absturz blieb aber trotzdem.
    Also vermute ich, dass der Fehler an dem oben genannten error C2440 liegt.
    Meine Frage ist nun, wie ich es kovertiert bekomme, oder ob es noch eine andere Lösung gibt.



  • hi

    Nah wie wohl ?

    wchar_t name={L"aaa"};

    Habe gedacht du kennst dich aus. Scheinbar nicht. Also meine doch, zuerst besser c in den griff bekommen, als sich mit etwas rumzuschlagen das man noch nicht versteht !

    Cya lb



  • Hi

    Um in nicht ganz durcheinander zu bringen sollte ich es noch Syntax mässig, richtig schreiben. 🙂

    wchar_t szName[]={L"hello"};

    lowbyte



  • Gast123 schrieb:

    Also setzte ich meinen Zeichensatz auf "Nicht festgelegt"
    ...
    Also vermute ich, dass der Fehler an dem oben genannten error C2440 liegt.

    "Nicht festgelegt" ist richtig. Der Absturz hat eine andere Ursache, vielleicht mal debuggen ...



  • @Phistomefel: Ich habe es jetzt mal mit Debuggen versucht; Und bei beiden Einstellungen (Zeichensatz auf Unicode bzw. "Nicht festgelegt") bekomme ich folgendes:

    [... bla.dll geladen...]
    "Pipette.exe": "C:\WINDOWS\system32\version.dll" wurde geladen
    "Pipette.exe": "C:\WINDOWS\system32\version.dll" entladen.
    Eine Ausnahme (erste Chance) bei 0x00000000 in Pipette.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Unbehandelte Ausnahme bei 0x00000000 in Pipette.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Das Programm "[5176] Pipette.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.

    Anscheinend liegt es an diesen Prozessadressen, dass das Programm abstürzt. Hat da noch jemand eine Idee, wie man es beheben kann?



  • Hi

    Also dem sage ich nich debuggen !!
    Dll's kannst du auch nicht so einfach debuggen !
    Ausser Compiler Warnungen bekommst du nichts! Das heisst wen alles Syntaktisch ok ist muss es nicht heissen dass das Programm auch einwandfrei läuft.
    Wie ich schon gesagt habe (Buffer / Stack)Overflows / Formatstring bugs etc.. mal auf das schauen ! Man sollte sich schon mit Pointer etc. auskennen. Viele Probleme liegen nämlich dort. !!

    lowbyte_


  • Mod

    DLLs debuggt man genauso einfach wie jedes andere Ausführbare Programm...



  • Hi

    Wie willst du eine dll debuggen ? mit dem compiler geht das nicht ! Damit du die exportierten funktionen nützen kannst, musst du ja eine korekte dll haben ! und wen du die Funktionen jetz in der main aufrufen würdes kannst du das debuggen in der dll vergessen ...ala breakpoint !

    Lowbyte



  • Hi

    bei der erstellung der dll ist es natürlich was anderes !

    Lowbyte_



  • Hi

    Und zu Schluss.. wen du di dll bei erstellung debuggst, kannst du nur syntax fehler erkennen und sonnst nichts. Weil du ja keine werte hast die du prüfen kannst. Also logische fehler kannst du so nicht erkennen.

    Darum werden dll's anders debuggt !
    Lowbyte


Log in to reply