Есть длл которая подгружается к проге через LoadLibrary. В коде этой длл я делаю загрузку другой длл(в которой всего одна функция на экспорт), стандартно LoadLibrary -getProcAddress, после загрузки этой другой длл прога вылетает. Почему это происходит?
Чтоб чтото сказать про ошибку нужна среда, во первых контекст и бактрейс. Или выложите это приложение.
Код другой длл просто для теста Код (Text): library test; function JustGo:string; begin Result:='hello world'; end; exports JustGo; end.
Да вроде можно, только на время выполнения LoadLibrary захватывается LoaderLock, и пока твоя первая длл не сделает return из своей DllMain, вторая длл-ка не подгрузится.Поправьте меня если я не прав) Покажи DllMain первой длл и как ты грузишь вторую.
Примерно так: первая длл: Код (Text): ... Tcalc_double=function:string; ... function go(lib:pchar):boolean; var h:thandle; calc_double: Tcalc_double; s:string; begin Result:=false; h:=LoadLibrary(lib); if (h<>0) then begin @calc_double:=getProcAddress(h,'JustGo'); if addr(calc_double)=nil then begin freelibrary(h); exit; end; s:=calc_double; messagebox(0,pchar(s),'',0); Result:=true; end; freelibrary(h); deletefile(lib); end; ... procedure zero; begin repeat ... go(путь к длл которую нужно загрузить); unitil false end; ... procedure DLLEntryPoint(dwReason: DWord); var g:dword; begin case dwReason of DLL_PROCESS_ATTACH: begin BeginThread(nil,0,@zero,nil,0,g); end; DLL_PROCESS_DETACH: begin end; end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Длл которую загружаю: Код (Text): library test; function JustGo:string; begin Result:='hello world'; end; exports JustGo; end
onSide Текущему потоку допускаются рекурсивные вызовы. Критические секции реализованы таким образом, дабы избежать дедлоков, тоесть поток который захватил критическую секцию может войти в неё есё раз, будет увеличен счётчик входов. Иной тред будет щдать её освобождение. Поэтому тред загружающий модуль может загрузить другой модуль из InitRoutine первого. У автора приложение слетает, а не виснет.
Clerk ясно, спасибо) Selah что это за адский язык такой? Ниче не понятно))) На DLL_PROCESS_ATTACH возвращай TRUE если длл должна остаться в памяти и FALSE если не должна. DLLEntryPoint принимает 3 параметра вообщето. HANDLE hinstDLL,DWORD dwReason, LPVOID lpvReserved. Увы больше ниче сказать не могу, т.к. этот язык точно не для меня придумывали)) А вообще запусти в отладчике и посмотри почему конкретно падает.
onSide Это дельфе вероятно, я тоже его плохо понимаю. Selah На счёт второго модуля - где процедура инициализации, или её среда вставляет если по дефолту не названа ? Есчо чтото странное: Код (Text): begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end
А на такие вопросы вообще отвечать не стоит, потому что вопросы нужно писать МАКСИМАЛЬНО подробно, а не так в двух словах и без единого примера кода. Главное правило: когда создаете тему, нужно выложить максимум информации о проблеме, максимум
Selah С подобными вопросами лучше на дельфийские форумы обращаться Дело не в потоке, а в необходимости uses ShareMem при работе с динамич.строками, массивами и т.п. - а по сему в экспортируемых ф-ях dll лучше их не юзать вообще