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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по dll, не хочет работать 
:(
    Опции темы
Verus
Дата 7.6.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Суть такая что есть функции в дллке:
Код

extern "C" BOOL __stdcall DllMain ( HINSTANCE instance, DWORD reason, LPVOID reserved )
{
    MessageBoxA(0,"DllMain","!!!!!",MB_ICONINFORMATION);
    return true;
}


и

Код

extern "C" HRESULT __stdcall DllRegisterServer()
{    
    MessageBoxA(0,"DllRegisterServer","!!!!!",MB_ICONINFORMATION);
    while(true)
    {
        
    }
    return S_OK;
}


Когда произвожу дебаг с помощью привязки в regsvr32.exe в студии, то все проходит хорошо. А когда например установлю dll'ку в систему и после перезагрузки она должна запускаться автоматически, ничего не происходит. Пытаюсь ее удалить - нельзя, значит всетаки она загрузилась в память, но не работает. В чем может быть проблема?
PM MAIL   Вверх
Cheloveck
Дата 7.6.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



def файл с кодом примерно такого содержания я обычно прикомпилирую. 

Код

LIBRARY    "Server"

EXPORTS

    DllGetClassObject   PRIVATE
    DllCanUnloadNow     PRIVATE
    DllRegisterServer   PRIVATE
    DllUnregisterServer PRIVATE

Посмотри на свою таблицу импорта. Может там и нету этих функций...



--------------------
user posted image
PM Jabber   Вверх
jonie
Дата 8.6.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата

А когда например установлю dll'ку в систему и после перезагрузки она должна запускаться автоматически, ничего не происходит.
чего это она должна загружаться?? И вообще если ты не залогинен то и мессадж бокса не увидишь


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Verus
Дата 8.6.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Cheloveck, да у меня точно такой же файлsmile

jonie, потому что я прописываю в автозапуск и вывод сообщения не единственное что она должна делать.там по идее бесконечный цикл у меня. 
PM MAIL   Вверх
Verus
Дата 8.6.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем сейчас ситуация такая: dll загружается и работает, но не вызывается функция DllRegisterServer() где мне необходимо было вызвать:
Код

CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, 
        IID_IWebBrowser2, (void**)&pBrowser2);


тогда другой вопрос - как мне вызвать CoCreateInstance() из dll или это невозможно?
PM MAIL   Вверх
xvr
Дата 8.6.2009, 17:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



А с чего DllRegisterServer должна вызываться в автомате? Ее зовет только regsvr32

PM MAIL   Вверх
Cheloveck
Дата 8.6.2009, 17:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Ты не путай CoCreateInstance создаёт объект, а DllRegisterServer()  - просто регит классы в системном реестре, один раз


--------------------
user posted image
PM Jabber   Вверх
Verus
Дата 8.6.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Cheloveck @ 8.6.2009,  17:26)
Ты не путай CoCreateInstance создаёт объект, а DllRegisterServer()  - просто регит классы в системном реестре, один раз

Да я не путаю, просто мне необходимо вызвать CoCreateInstance как-то.
PM MAIL   Вверх
xvr
Дата 8.6.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Verus @ 8.6.2009,  22:06)
Цитата(Cheloveck @ 8.6.2009,  17:26)
Ты не путай CoCreateInstance создаёт объект, а DllRegisterServer()  - просто регит классы в системном реестре, один раз

Да я не путаю, просто мне необходимо вызвать CoCreateInstance как-то.

Ну так и вызывай из DllMain, какие проблемы ?
Только не забудь CoInitialize позвать.
Хотя нет, проблемы будут (MSDN):
Цитата

Because there is no way to control the order in which in-process servers are loaded or unloaded, do not call CoInitialize, CoInitializeEx, or CoUninitialize from the DllMain function.
Видимо надо что нибудь взвести в DllMain (например создать поток), и потом оттуда звать и CoInitialize и CoCreateInstance

PM MAIL   Вверх
Verus
Дата 9.6.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пытаюсь создать поток, но надо ограничить чтобы был поток только один:
Код

int count = (int) pvParam;
    count++;
    ofstream outfile("D:\\log.txt", ofstream::binary|ofstream::app);
    outfile <<"threadStart count:" << count << "\n";
    outfile.close();
    if(count > 1) return 0;

    for(int i=0;;i++)
    {
        ofstream outfile("D:\\log.txt", ofstream::binary|ofstream::app);
        outfile <<"threadStart:" << i << "\n";
        outfile.close();
    }


Но почему-то тут поток не впадает в бесконечный цикл. Точнее впадает, но потоков создается куча, хотя так не должно быть. Т.к. в поток передаю глобальную переменную.

Это сообщение отредактировал(а) Verus - 9.6.2009, 08:52
PM MAIL   Вверх
Andrey44
Дата 9.6.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Извините, не проснулся. smile 

Это сообщение отредактировал(а) Andrey44 - 9.6.2009, 14:21


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 9.6.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



запускай поток при fdwReason == DLL_PROCESS_ATTACH

раз он должен быть бесконечный, то на DLL_PROCESS_DETACH все равно придется завершиться в данном процессе и начать по-новой в другом (на следующий DLL_PROCESS_ATTACH), если таковые будут

а для нескольких одновременно запущенных процессов создавай простой именованый мьютекс
и распространяй владение им между DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH,
работать в таком случае всегда будет только один поток


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
xvr
Дата 9.6.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Verus @ 9.6.2009,  08:51)
Пытаюсь создать поток, но надо ограничить чтобы был поток только один:
Код

int count = (int) pvParam;
    count++;
    ofstream outfile("D:\\log.txt", ofstream::binary|ofstream::app);
    outfile <<"threadStart count:" << count << "\n";
    outfile.close();
    if(count > 1) return 0;

    for(int i=0;;i++)
    {
        ofstream outfile("D:\\log.txt", ofstream::binary|ofstream::app);
        outfile <<"threadStart:" << i << "\n";
        outfile.close();
    }


Но почему-то тут поток не впадает в бесконечный цикл. Точнее впадает, но потоков создается куча, хотя так не должно быть. Т.к. в поток передаю глобальную переменную.

Код делает непонятно что  smile 
Во первых он явно не считает количество своих вызовов, т.к. счетчик count у него локальный
Во вторых, он зацикливается и фигачит в бедный 'D:\log.txt' до переполнения диска
В третьих вообще не ясно как он создается (да и терминировать его тоже желательно, GremlinProg абсолютно правильно заметил)
В четвертых, а нельзя ли вообще обойтись без dll? Автозапуск обычно все же на .exe делают, автозапустить .dll без извратов (типа rundll32) вообще невозможно

Добавлено через 2 минуты и 41 секунду
Кстати, вопрос вдогонку - зачем создавать IE при запуске? Он скорее всего не заработает, ему нужно много чего для работы, что появится только после ПОЛНОЙ раскрутки залогиненного пользователя.

PM MAIL   Вверх
Verus
Дата 9.6.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(GremlinProg @  9.6.2009,  09:11 Найти цитируемый пост)
запускай поток при fdwReason == DLL_PROCESS_ATTACH

раз он должен быть бесконечный, то на DLL_PROCESS_DETACH все равно придется завершиться в данном процессе и начать по-новой в другом (на следующий DLL_PROCESS_ATTACH), если таковые будут

а для нескольких одновременно запущенных процессов создавай простой именованый мьютекс
и распространяй владение им между DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH,
работать в таком случае всегда будет только один поток 


А можно чуток поподробней как это сделать?
Я делаю примерно так:
Код

extern "C" BOOL __stdcall DllMain ( HINSTANCE instance, DWORD reason, LPVOID reserved )
{
    switch(reason)
    {
    case DLL_PROCESS_ATTACH:
        {
            ofstream outfile("D:\\log.txt", ofstream::binary|ofstream::app);
            outfile <<"DllMain" << "\n";
            outfile.close();
            unsigned ThreadID;
            HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &threadStart, (PVOID) 0, 0, &ThreadID);
            break;
        }
    case DLL_PROCESS_DETACH:
        {
            break;
        }
    }
    return true;
}

Код

unsigned WINAPI threadStart(PVOID pvParam)
{
    _threadCount++;
    ofstream outfile("D:\\log1.txt", ofstream::binary|ofstream::app);
    outfile <<"threadStart count:" << _threadCount << "\n";
    outfile.close();
    if(_threadCount > 1) return 0;

    for(int i=0;;i++)
    {
        ofstream outfile("D:\\log2.txt", ofstream::binary|ofstream::app);
        outfile <<"threadStart:" << i << "\n";
        outfile.close();
        Sleep(5000);
    }

}

Но так в бесконечный цикл не впадает. Чего-то я не понял как сделать с мьютексами :(

Добавлено через 8 минут и 17 секунд
Цитата(xvr @  9.6.2009,  09:30 Найти цитируемый пост)
Кстати, вопрос вдогонку - зачем создавать IE при запуске? Он скорее всего не заработает, ему нужно много чего для работы, что появится только после ПОЛНОЙ раскрутки залогиненного пользователя.

Ну тут можно ведь поставить какой нить Sleep() и подождать пока нормально загрузится все.
А вообще нужно именно длл, с ехе все получается без проблем и работает.
PM MAIL   Вверх
GremlinProg
Дата 9.6.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Код

case DLL_PROCESS_ATTACH:
  ImOwner = FALSE;
  hMutex = ::CreateMutex(NULL,FALSE,_T("MyMutex"));
  if( ::WaitForSingleObject(hMutex,0) == WAIT_OBJECT_0 ){
    ImOwner = TRUE;
    // создать поток
  }
  break;
case DLL_PROCESS_DETACH:
  if( ImOwner ){
    ::ReleaseMutex( hMutex );
  }
  ::CloseHandle( hMutex );
  break;

тогда счетчики в потоке не нужны,
но данные, которые поток генерирует (если он это делает), должны быть переданы в другой процесс на DLL_PROCESS_DETACH, чтобы поток всякий раз не начинал работу с нуля

хотя это и не так интересно, перекидывать свою работу из процесса в процесс,
гораздо проще все таки все это делать в своем собственном процессе (без длл)

xvr, верно подметил,
длл все таки обычно используют пассивно, слейвом, т.е. без ее собственной инициативы,
к чему такие навороты, Verus?


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

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


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

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


 




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


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

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