Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потерялась DllMain 
:(
    Опции темы
EnergoHokum
Дата 13.4.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Доброго времени суток всем. Под MinGW пишу DLL-ку, которая будет использоваться одновременно несколькими процессами. Проблема в том, что "не видится" DllMain, и, соответственно, DLL_PROCESS_ATTACH и проч. с ними. В то же время явно вызываемая функция нормально отрабатывает.
Вот DLL:
Код

#include <windows.h>
#include <iostream>

extern "C" __declspec(dllexport) int testFunction(void)
{
    std::cout<<"Print test text"<<std::endl;
    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hModule,
                                        DWORD fdwReason,
                                        LPVOID lpReserved
                                        )
{
    MessageBox(NULL,"DllMain","DllMain",MB_OK);
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        std::cout<<"DllMain attached to process"<<std::endl;
        break;
    case DLL_PROCESS_DETACH:
        std::cout<<"DllMain detached at process"<<std::endl;
        break;
    case DLL_THREAD_ATTACH:
        std::cout<<"DllMain attached to thread"<<std::endl;
        break;
    case DLL_THREAD_DETACH:
        std::cout<<"DllMain detached at thread"<<std::endl;
        break;
    }
    return TRUE;
}


Вот екзешник, из которого она вызывается:
Код

#include <windows.h>
#include <iostream>
#include <string>

__declspec(dllimport) int testFunction(void);

int main(int argc,char** argv)
{
    char command[255];
    char exit[]="exit";
    int i=0;
    HMODULE hModule=LoadLibrary("d.dll");
    if(hModule == 0)
        return -1;
    typedef int (*pTestFunction)(void);
    pTestFunction pTF=(pTestFunction)GetProcAddress(hModule,"testFunction");
    if(pTF == 0)
        return -1;
    pTF();
    std::cout<<"Start loop, to exit say 'exit'"<<std::endl;
    while(1)
    {
        memcpy(command,&i,255);
        std::cin>>command;
        if(strcmp(command,exit) == 0)
        {
            std::cout<<"I am exit"<<std::endl;
            break;
        }
        Sleep(100);
        std::cout<<command<<std::endl;
    }
    std::cout<<"End execute"<<std::endl;
    BOOL b=FreeLibrary(hModule);
    return 0;
}


Вот, на всякий случай, Makefile:
Код

REMOVE = rm -f
INEXECUTE = main
INDLL = dll
OUTEXECUTE = a
OUTDLL = d

$(OUTDLL) : $(INDLL).o
    g++ -shared -o $(OUTDLL).dll $(INDLL).o
    dlltool -l $(OUTDLL).a $(INDLL).o
$(INDLL).o : $(INDLL).cpp
    g++ -c $(INDLL).cpp
$(OUTEXECUTE) : $(INEXECUTE).o
    g++ -o $(OUTEXECUTE) $(INEXECUTE).o #-L ./ -ld
$(INEXUTE).o : $(INEXECUTE).cpp
    g++ -c $(INEXECUTE).cpp
dll :
    $(MAKE) $(OUTDLL)
exe :
    $(MAKE) $(OUTEXECUTE)
clean :
    $(REMOVE) $(OUTDLL).dll
    $(REMOVE) $(INDLL).o
    $(REMOVE) $(OUTDLL).a
    $(REMOVE) $(INEXECUTE).o
    $(REMOVE) $(OUTEXECUTE).exe
ALL : clean exe dll


Я в этих делах не сильно копенгаген, поэтому просьба больно не пинать smile
PM MAIL ICQ   Вверх
EnergoHokum
Дата 13.4.2007, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Посмотрел hex-редактором dll-ки, сделанные GCC и MSVS, видно, что GCC декорирует MainDll, если сделать так:
Код

extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule,
                                              DWORD  fdwReason,
                                              LPVOID lpReserved
                                              )

то всё работает, как нужно. Почему же в микрософтовом компиляторе по умолчанию всё работает?
Опять какие-то "недокументированные возможности"?
PM MAIL ICQ   Вверх
Gwendolen
Дата 16.4.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: 1
Всего: 1



Спасибо EnergoHokum, 
Цитата
видно, что GCC декорирует MainDll
 Только что я столкнулся со схожей проблемой, в принципе экспортировать DllMain не надо достаточно не искажать имя:
Код

extern "C" BOOL WINAPI DllMain (HINSTANCE hModule, DWORD fdwReason, LPVOID lpReserved)
{
...
}

--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.