Загрузка длл из другой длл

Тема в разделе "WASM.WIN32", создана пользователем Selah, 12 сен 2009.

  1. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    Есть длл которая подгружается к проге через LoadLibrary. В коде этой длл я делаю загрузку другой длл(в которой всего одна функция на экспорт), стандартно LoadLibrary -getProcAddress, после загрузки этой другой длл прога вылетает. Почему это происходит?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    http://wasm.ru/forum/viewtopic.php?id=32181
     
  3. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    объясни пожалуйста, я не такой спец как ты
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Чтоб чтото сказать про ошибку нужна среда, во первых контекст и бактрейс. Или выложите это приложение.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ну это ни о чем не говорит, кривой код может быть и в DllMain(DllEntry)
     
  6. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    Код другой длл просто для теста

    Код (Text):
    1. library test;
    2.  
    3. function JustGo:string;
    4. begin
    5. Result:='hello world';
    6. end;
    7.  
    8. exports JustGo;
    9.  
    10. end.
     
  7. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    мне просто нужно знать можно ли так вообще загружать длл?
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Да вроде можно, только на время выполнения LoadLibrary захватывается LoaderLock, и пока твоя первая длл не сделает return из своей DllMain, вторая длл-ка не подгрузится.Поправьте меня если я не прав)

    Покажи DllMain первой длл и как ты грузишь вторую.
     
  9. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    Примерно так:

    первая длл:
    Код (Text):
    1. ...
    2. Tcalc_double=function:string;
    3. ...
    4. function go(lib:pchar):boolean;
    5. var
    6. h:thandle;
    7. calc_double: Tcalc_double;
    8. s:string;
    9. begin
    10. Result:=false;
    11. h:=LoadLibrary(lib);
    12. if (h<>0) then
    13. begin
    14. @calc_double:=getProcAddress(h,'JustGo');
    15. if addr(calc_double)=nil then begin freelibrary(h); exit; end;
    16. s:=calc_double;
    17. messagebox(0,pchar(s),'',0);
    18. Result:=true;
    19. end;
    20. freelibrary(h);
    21. deletefile(lib);
    22. end;
    23. ...
    24. procedure zero;
    25. begin
    26. repeat
    27. ...
    28. go(путь к длл которую нужно загрузить);
    29. unitil false
    30. end;
    31. ...
    32. procedure DLLEntryPoint(dwReason: DWord);
    33. var g:dword;
    34. begin
    35. case dwReason of
    36. DLL_PROCESS_ATTACH:
    37. begin
    38. BeginThread(nil,0,@zero,nil,0,g);
    39. end;
    40. DLL_PROCESS_DETACH:
    41. begin
    42.  
    43. end;
    44. end;
    45. end;
    46.  
    47.  
    48. begin
    49. DllProc := @DLLEntryPoint;
    50. DLLEntryPoint(DLL_PROCESS_ATTACH);
    51. end.
    Длл которую загружаю:
    Код (Text):
    1. library test;
    2.  
    3. function JustGo:string;
    4. begin
    5. Result:='hello world';
    6. end;
    7.  
    8. exports JustGo;
    9.  
    10. end
     
  10. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    функция с другой длл запускается, но сразу же вылетает прога
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    onSide
    Текущему потоку допускаются рекурсивные вызовы. Критические секции реализованы таким образом, дабы избежать дедлоков, тоесть поток который захватил критическую секцию может войти в неё есё раз, будет увеличен счётчик входов. Иной тред будет щдать её освобождение. Поэтому тред загружающий модуль может загрузить другой модуль из InitRoutine первого. У автора приложение слетает, а не виснет.
     
  12. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Clerk ясно, спасибо)
    Selah что это за адский язык такой? Ниче не понятно)))
    На DLL_PROCESS_ATTACH возвращай TRUE если длл должна остаться в памяти и FALSE если не должна.
    DLLEntryPoint принимает 3 параметра вообщето. HANDLE hinstDLL,DWORD dwReason, LPVOID lpvReserved.
    Увы больше ниче сказать не могу, т.к. этот язык точно не для меня придумывали))

    А вообще запусти в отладчике и посмотри почему конкретно падает.
     
  13. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    :) нормальный язык. Ошибку нашел. Я не правильно работал с указателями в другом потоке.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    onSide
    Это дельфе вероятно, я тоже его плохо понимаю.
    Selah
    На счёт второго модуля - где процедура инициализации, или её среда вставляет если по дефолту не названа ?
    Есчо чтото странное:
    Код (Text):
    1. begin
    2. DllProc := @DLLEntryPoint;
    3. DLLEntryPoint(DLL_PROCESS_ATTACH);
    4. end
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    да тут ошибка на ошибке похоже, хотя дельфи не люблю
     
  16. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    Ладно парни)) куда мне до вас)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А на такие вопросы вообще отвечать не стоит, потому что вопросы нужно писать МАКСИМАЛЬНО подробно, а не так в двух словах и без единого примера кода.
    Главное правило: когда создаете тему, нужно выложить максимум информации о проблеме, максимум
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Selah
    С подобными вопросами лучше на дельфийские форумы обращаться
    Дело не в потоке, а в необходимости uses ShareMem при работе с динамич.строками, массивами и т.п. - а по сему в экспортируемых ф-ях dll лучше их не юзать вообще