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 .
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:
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL) //<- zu empfehlen
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL) //<- zu empfehlen
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL) //<- zu empfehlen
@ 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:
/*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;
}
/*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;
}
/*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;
}
/*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;
}
/*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;
}
/*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;
}
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.
@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?
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 !
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.
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):
Zitat:
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:
Zitat:
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
Zitat:
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.
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 !
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.