Chodzi o to że gdy w programie wywołuje funkcje z biblioteki dll to chyba wcale ona się nie wykonuje. Cały czas zwraca 0.
Główny plik aplikacji:
#include <windows.h>
using namespace std;
HINSTANCE hInst;
std::string g_strKlasaOkna = "od0dogk_Window";
DWORD WINAPI HOOK(PVOID);
HMODULE hKBHookDLL;
typedef void (*LPSetKBHook)(void);
LPSetKBHook SetKBHook = NULL;
typedef unsigned long (*LPGetKeyStrokes)(void);
LPGetKeyStrokes GetKeyStrokes = NULL;
typedef unsigned long (*LPGetKeyCounter)(void);
LPGetKeyCounter GetKeyCounter = NULL;
typedef void (*LPKillKBHook)(void);
LPKillKBHook KillKBHook = NULL;
BOOL LoadHookDLL()
{
hKBHookDLL = LoadLibrary("def.dll");
if (!hKBHookDLL)return(0);
SetKBHook = (LPSetKBHook)GetProcAddress(hKBHookDLL, "SetKBHook");
if (!SetKBHook) return(0);
GetKeyStrokes = (LPGetKeyStrokes)GetProcAddress(hKBHookDLL, "GetKeyStrokes");
if (!GetKeyStrokes) return(0);
GetKeyCounter = (LPGetKeyCounter)GetProcAddress(hKBHookDLL, "GetKeyCounter");
if (!GetKeyCounter)return(0);
KillKBHook = (LPKillKBHook)GetProcAddress(hKBHookDLL, "KillKBHook");
if (!KillKBHook)return(0);
SetKBHook();
return(1);
}
void FreeHookDLL()
{
KillKBHook();
FreeLibrary(hKBHookDLL);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
DWORD IdWatku;
int x=3;
CreateThread(NULL, 0, HOOK, (PVOID)x, 0, &IdWatku);
MSG msgKomunikat;
while (GetMessage(&msgKomunikat, NULL, 0, 0))
{
TranslateMessage (&msgKomunikat);
DispatchMessage (&msgKomunikat);
}
return static_cast<int>(msgKomunikat.wParam);
}
DWORD WINAPI HOOK(PVOID)
{
long int znak,ilosc=0,ilosc_temp=0,diff=0,ilosc_zn=0;
LoadHookDLL(); //zwraca 1, więc wszystko ok
while(1)
{
znak=GetKeyStrokes(); //znak i ilosc zawsze sa równe 0, ale adresy do biblioteki tych funkcji są poprawne
ilosc_zn=GetKeyCounter();
if(ilosc_zn!=ilosc_temp)
{
ilosc_temp=ilosc_zn;
diff=ilosc_zn-ilosc_temp;
} else diff=0;
.
.
.
.
.
plik biblioteki:
#include <windows.h>
HHOOK hhook = NULL;
long int key = 0;
long int keycount = 0;
int pcount = 0;
HINSTANCE g_hInstance = NULL;
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
if(pcount == 0)
{
// Init
g_hInstance = hInstance;
}
pcount++;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
if(pcount == 1)
{
// Free
}
pcount--;
}
return(1);
}
extern "C" _declspec(dllexport) LRESULT CALLBACK KBHookProc(int Code, WPARAM wParam, LPARAM lParam)
{
if (Code < 0) return(CallNextHookEx(hhook, Code, wParam, lParam));
if (lParam & (1 << 31)){ key=wParam; keycount++;}
return(CallNextHookEx(hhook, Code, wParam, lParam));
}
extern "C" _declspec(dllexport) void SetKBHook()
{
if (!hhook) hhook = SetWindowsHookEx(WH_KEYBOARD, KBHookProc, g_hInstance, 0);
}
extern "C" _declspec(dllexport) long int GetKeyStrokes()
{
return(key);
}
extern "C" _declspec(dllexport) long int GetKeyCounter()
{
return(keycount);
}
extern "C" _declspec(dllexport) void KillKBHook()
{
if(hhook) UnhookWindowsHookEx(hhook);
}
Natomiast jeśli dll-kę używa program poniżej to wszystko jest ok.
//http://qsoft.cjb.net
//For any questions/comments/thing send an email to [email protected]
//Feel free to do with this anything you want!
//21/4/2001
#include <windows.h>
#include <stdio.h>
#include "resource.h"
long int ilosc_temp,diff;
HMODULE hKBHookDLL;
typedef void (*LPSetKBHook)(void);
LPSetKBHook SetKBHook = NULL;
typedef unsigned long (*LPGetKeyStrokes)(void);
LPGetKeyStrokes GetKeyStrokes = NULL;
typedef unsigned long (*LPGetKeyCounter)(void);
LPGetKeyCounter GetKeyCounter = NULL;
typedef void (*LPKillKBHook)(void);
LPKillKBHook KillKBHook = NULL;
BOOL LoadHookDLL()
{
hKBHookDLL = LoadLibrary("def.dll");
if (!hKBHookDLL) return(0);
SetKBHook = (LPSetKBHook)GetProcAddress(hKBHookDLL, "SetKBHook");
if (!SetKBHook) return(0);
GetKeyStrokes = (LPGetKeyStrokes)GetProcAddress(hKBHookDLL, "GetKeyStrokes");
if (!GetKeyStrokes) return(0);
GetKeyCounter = (LPGetKeyCounter)GetProcAddress(hKBHookDLL, "GetKeyCounter");
if (!GetKeyCounter) return(0);
KillKBHook = (LPKillKBHook)GetProcAddress(hKBHookDLL, "KillKBHook");
if (!KillKBHook) return(0);
SetKBHook();
return(1);
}
void FreeHookDLL()
{
KillKBHook();
FreeLibrary(hKBHookDLL);
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
if (!LoadHookDLL()) EndDialog(hDlg, 0);
SetTimer(hDlg, 0, 10, NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_OK: EndDialog(hDlg, 0); break;
}
break;
case WM_TIMER:
switch(wParam)
{
case 0:
HWND hTmp = GetDlgItem(hDlg, IDC_EDIT1);
char str[50];
sprintf(str, "%d", GetKeyStrokes());
long int ilosc_zn=GetKeyCounter();
ilosc_zn=GetKeyCounter();
if(ilosc_zn!=ilosc_temp)
{
ilosc_temp=ilosc_zn;
diff=ilosc_zn-ilosc_temp;
} else diff=0;
SetWindowText(hTmp, str);
break;
}
break;
case WM_DESTROY:
FreeHookDLL();
break;
}
return(0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
return(1);
}
Co może być nie tak w pierwszym kodzie(a Visual nie wywala błędu)? Próbowałem także uruchomić pierwszy kod w projekcie tego działającego ale tez to samo...wiec to chyba nie ustawienia. Wiec co?