Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

FreeLibrary   Найти похожие ветки 

 
Ertong ©   (2004-07-30 19:02) [0]

Загружаю библиотеку в чужой процесс с помощью CreateRemoteThread.

library Project2;
uses Windows;
var
 a:array[0..MAX_Path] of char;
begin
 getModuleFileName(hInstance,@a,sizeOf(a));
 MessageBox(0,a,"Hello world",MB_SYSTEMMODAL);
 FreeLibrary(hInstance);
end.


MessageBox выдает путь к DLL. Соответсвенно здесь hInstance - это хандл библиотеки(а не процесса как я раньше думал :))! Но FreeLibrary приводит не к выгрузки библиотеки, а к краху чужого процесса. Почему это так происходит? Мне нужно, чтобы библиотека сделала какое-то действие(например, получила список елементов в ListView) в адресном пространстве чужого процесса и мирно выгрузилась.


 
Vetek_2   (2004-07-30 19:58) [1]

у меня похожая проблема  ... - пока не решил :(
думаю нельзя самой библиотеке делать себе freelibrary - "самоубийство" имхо .. :)))


 
Ertong ©   (2004-07-30 20:13) [2]

Как-то не логично. Если нельзя, то почему Freelibrary не заканчивается ошибкой, а просто губит "жертву". Что-то мне подсказывает, что не HInstance нужно юзать, но что?


 
Ertong ©   (2004-07-30 20:27) [3]

Решено:)

var
 a:array[0..MAX_Path] of char;
 FreeLib:Pointer;
 id:cardinal;
begin
 getModuleFileName(hInstance,@a,sizeOf(a));
 MessageBox(0,a,"qwertyHello world",MB_SYSTEMMODAL);

 FreeLib:=GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary");
 CreateThread(nil,0,FreeLib,pointer(hInstance),0,id);
end.


 
ASd   (2004-07-30 20:32) [4]

правильно!


 
Ertong ©   (2004-07-30 22:38) [5]

function thread(p:pointer):integer; stdcall;
begin
//  ................................
//   Длинная работа
//................................

 FreeLibrary(HInstance);
end;

begin
 HThread:=CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


А так не пашет :(


> правильно!

Я не совсем хорошо понимаю природу этого явления. Если не сложно, можно обьяснить?


 
Ertong ©   (2004-07-30 23:01) [6]

function thread(p:pointer):integer; stdcall;
begin
//  ................................
//   Длинная работа
//................................

 CreateThread(nil,0,GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary"),pointer(hInstance),0,id);
end;

begin
HThread:=CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


А если так, то пашет :)


 
Cobalt ©   (2004-07-31 04:51) [7]

2 Ertong ©   (30.07.04 20:13) [2]
Эх, не предусмотрели товарищи разработчики из Майкрософт, что кто-то захочет сделатьсебе харакири через анальное отверстие :)

Может, оно как раз и оканчивается ошибкой? ;)



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1092745901
Len
2004-08-17 16:31
2004.09.12
База для хранения "разных" файлов


1-1093434025
Cat
2004-08-25 15:40
2004.09.12
Работа с портами LPT


14-1093172099
Светик
2004-08-22 14:54
2004.09.12
Жаждущая чего-нибудь ахового и интересного


1-1093798757
Stas_on
2004-08-29 20:59
2004.09.12
Как зарегистрировать своё расширение из Delphi


1-1093871349
Erik1
2004-08-30 17:09
2004.09.12
Как изменить во время (Pause, Resume) TimeOut сервиса?