Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.022 c
14-1092977204
Рамиль
2004-08-20 08:46
2004.09.12
Ведение реестра акционеров эмитентом


14-1093533065
Lena
2004-08-26 19:11
2004.09.12
что делать?


3-1092489470
SDV_fox
2004-08-14 17:17
2004.09.12
Помогите найти толковую доку или обучалку по продуктам DevExpress


14-1093361502
Лена
2004-08-24 19:31
2004.09.12
Вирусы


14-1092983461
Dimka Maslov
2004-08-20 10:31
2004.09.12
Юридическая задача




   Наверх