![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подключить 32 битную библиотеку к 16 битному приложению. [D1, D7, Win95/98, WinME, NT4, Win2k, WinXP]
Ganda © (2007-05-26 12:06:00)как можно подключить
32 битную библиотеку к 16 битному приложению?
Собственно говоря и весь вопрос!!
Сергей М. (2007-05-29 08:55:00) [1]
> Ganda © (29.05.07 08:37) [10]
Ну хорошо.
Пусть, предположим, ф-ция CallProc32W имеет возможность вернуть этот самый TObject.
И что 16-битное приложение будет делать с этим TObject'ом ?
Это ж не иначе как басня Крылова получится, про мартышку с очками)
Ganda (2007-05-29 08:37:00) [2]Сергей М. © (29.05.07 08:30) [9]
function Test(const AText : String) : TObject;stdcall;
Сергей М. (2007-05-29 08:30:00) [3]Покажи прототип вызываемой из dll ф-ции..
ganda (2007-05-29 07:41:00) [4]Как вызывать 32-bit DLL из 16-bit приложения разобрался и как передавать параметры!
А вот как можно получить результат выполняемой функции!
Ведь процедура CallProc32W возвращает только тип LongInt!
Leonid Troyanovsky (2007-05-28 15:40:00) [5]
> ganda © (28.05.07 15:10) [5]
> Отдельное спасибо Leonid Troyanovsky!
Не знаю, за что отдельное, но я советовал прочитать статью:
The basic steps for calling a function through generic thunking are:
• Call LoadLibraryEx32W() to load the Win32 DLL.
• Call GetProcAddress32W() to get the address of the DLL routine.
• Call the DLL routine using CallProc32W() or CallProcEx32W.
Ищущий да обрящет.
--
Regards, LVT.
Сергей М. (2007-05-28 15:31:00) [6]
> Как только вызываешь саму процедуру возникает ошибка
Как же ей не возникнуть, если значение в переменной DLL после вызова GetProcAddress32W не являет собой валидный адрес в АП тек.процесса ?
Вот же пример:
http://www.tenermerx.com/owlhow/items/miscellaneous/thunk/index.html
Почему ему не последовать ?
ganda (2007-05-28 15:10:00) [7]вот что у меня получилось при активном поиске в инете!!
Загрузка DLL-ки происходит нормально, получения адресса процедуры так же все нормально!! Как только вызываешь саму процедуру возникает ошибка!!
Kernel386Handle:=LoadLibrary('KRNL386.Exe');
@LoadLibraryEx32W:=GetProcAddress(Kernel386Handle,'LoadLibraryEx32W');
@GetProcAddress32W:= GetProcAddress(Kernel386Handle,'GetProcAddress32W');
@FreeLibrary32W:=GetProcAddress(Kernel386Handle,'FreeLibrary32W');
Handle_twojego_dll:=LoadLibraryEx32W('RNiONFLK',nil,0);
if Handle_twojego_dll <> nil then
begin
@DLL := GetProcAddress32W(Handle_twojego_dll, PChar(LongInt(1)));
if addr(DLL) <> nil then
DLL;
end;
FreeLibrary32W(Handle_twojego_dll);
FreeLibrary(Kernel386Handle);
Отдельное спасибо Leonid Troyanovsky!
SlymRO (2007-05-28 08:05:00) [8]от я протупил... надо то наоборот :)
Leonid Troyanovsky (2007-05-28 07:14:00) [9]
> ganda © (28.05.07 06:27) [1]
> Как можно вызвать процедуру(функцию) из 32-bit DLL в 16-
> bit приложении?!
http://support.microsoft.com/kb/104009
--
Regards, LVT.
SlymRO (2007-05-28 06:52:00) [10]ganda © (28.05.07 6:27) [1]
через 16битный стаб-exe
аля rundll16.exe dll16.dll,MyProc
ganda (2007-05-28 06:27:00) [11]Перефразирую вопрос!
Как можно вызвать процедуру(функцию) из 32-bit DLL в 16-bit приложении?!