Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c