![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeLibrary [D7, WinXP]
Ertong © (2004-07-30 19:02:00)Загружаю библиотеку в чужой процесс с помощью 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) в адресном пространстве чужого процесса и мирно выгрузилась.
Cobalt (2004-07-31 04:51:00) [1]2 Ertong © (30.07.04 20:13) [2]
Эх, не предусмотрели товарищи разработчики из Майкрософт, что кто-то захочет сделатьсебе харакири через анальное отверстие :)
Может, оно как раз и оканчивается ошибкой? ;)
Ertong (2004-07-30 23:01:00) [2]
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.
А если так, то пашет :)
Ertong (2004-07-30 22:38:00) [3]
function thread(p:pointer):integer; stdcall;
begin
// ................................
// Длинная работа
//................................
FreeLibrary(HInstance);
end;
begin
HThread:=CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.
А так не пашет :(
> правильно!
Я не совсем хорошо понимаю природу этого явления. Если не сложно, можно обьяснить?
ASd (2004-07-30 20:32:00) [4]правильно!
Ertong (2004-07-30 20:27:00) [5]Решено:)
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.
Ertong (2004-07-30 20:13:00) [6]Как-то не логично. Если нельзя, то почему Freelibrary не заканчивается ошибкой, а просто губит "жертву". Что-то мне подсказывает, что не HInstance нужно юзать, но что?
Vetek_2 (2004-07-30 19:58:00) [7]у меня похожая проблема ... - пока не решил :(
думаю нельзя самой библиотеке делать себе freelibrary - "самоубийство" имхо .. :)))