Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

GetProcAddress и kernel32.dll   Найти похожие ветки 

 
Е-Моё имя   (2003-08-17 18:41) [0]

привет всем
проблемка есть с вызовом GetProcAddress для kernel32.dll

суть проблемы: есть такая штука-
function LoadLibrary16; external "kernel32.dll" index 35;
хочу сделать такую штуку-
@LoadLibrary16:=GetProcAddress(KernelLib,MAKEINTRESOURCE(35));

GetProcAddress возвращает nil :-(

вопрос1: как добраться до нужной функции в kernel32 по индексу?
вопрос2: у меня не работает из-за того, что есть какие-то особенности при работе с kernel32 или потому что руки неоттуда? ;-)


 
Polevi   (2003-08-17 21:00) [1]

не надо по индексу, там проблемы, Microsoft не рекомендует, получай по имени


 
Polevi   (2003-08-17 21:03) [2]

PS
Дж Рихтер Windows для профессионалов, часть 4 глава 19 стр 485


 
Е-Моё имя   (2003-08-18 00:10) [3]

да, есть там такое
кому интересно, выдержка:
NOTE:
Многие разработчики — особенно те, у кого большой опыт программирования для 16-разрядной Windows, — привыкли экспортировать функции из DLL, присваивая им порядковые номера Но Microsoft не публикует такую информацию по системным DLL и требует связывать EXE- или DLL-файлы с Windowsфункциями только по именам. Используя порядковый номер, Вы рискуете тем, что Ваша программа не будет работать в других версиях Windows.

Кстати, именно это и случилось со мной. В журнале MicrosoftSystemsJournal я опубликовал программу, построенную на применении порядковых номеров. В Windows NT 3.1 программа работала прекрасно, но сбоила при запуске в Windows NT 3.5. Чтобы избавиться от сбоев, пришлось заменить порядковые номера именами функций, и все встало на свои места.

Я поинтересовался, почему Microsoft отказывается от порядковых номеров, и получил такой ответ: «Мы (Microsoft) считаем, что РЕ-формат позволяет сочетать преимущества порядковых номеров (быстрый поиск) с гибкостью импорта по именам. Учтите и то, что в любой момент в API могут появиться новые функции. А с порядковыми номерами в большом проекте работать очень трудно — тем более, что такие проекты многократно пересматриваются

Работая с собственными DLL-модулями и связывая их со своими ЕХЕ-файлами, порядковые номера использовать вполне можно Microsoft гарантирует, что этот метод будет работоспособен даже в будущих версиях операционной системы Но лично я стараюсь избегать порядковых номеров и отныне применяю при связывании только имена.

так а где взять имя? имя процедуры неизвестно ((
tdump имени не дает, где взять имя-загадка ((((
косяк какой-то получается....


 
Digitman   (2003-08-18 08:51) [4]

2-й параметр ф-ции GetProcAddress() есть 4-хбайтное значение.

если это значение >=65536 , то оно интерпретируется как указатель на строковые данные, содержащие имя требуемой эксп.ф-ции (PChar)

если это значение лежит в диапазоне [0..65535], то оно интерпретируется как индекс требуемой экп.ф-ции (DWord, где ст.слово = 0, мл.слово = индекс)

исходя из этого и пляши


 
Е-Моё имя   (2003-08-18 09:12) [5]

Digitman © (18.08.03 08:51) [4]
угу...наплясался...
прочитай еще раз
@LoadLibrary16:=GetProcAddress(KernelLib,MAKEINTRESOURCE(35));


 
Digitman   (2003-08-18 10:08) [6]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/w98dd k/hh/w98ddk/kernel_4cmw.asp


 
Е-Моё имя   (2003-08-18 10:25) [7]

Digitman © (18.08.03 10:08)

ок, большое спасибо
дома попробую

все-таки интересно разобраться с сабжем
почему так получается, что один способ работает, а другой - нет?
разные способы должны работать _по-разному_, но _работать_ ;-)


 
Digitman   (2003-08-18 10:38) [8]


> почему так получается, что один способ работает, а другой
> - нет?


потому что штатный (документированный) способ - это обращение к 16-битному коду с помощью макроса VxDCall (описанного в Win9xDDK)

а вот с чего ты взял, что 35-й ординал в ядерной библ-ке маздая есть LoadLibrary16 - совершенно непонятно. Приведи ссылку на первоисточник, на основании которого ты декларируешь ф-цию и ожидаешь именно такую ее внутреннюю функц-ть


 
Е-Моё имя   (2003-08-18 11:45) [9]

Digitman © (18.08.03 10:38)
>>Приведи ссылку на первоисточник
с этим трудно
где-то выискал, дома поищу, может и найду первоисточник
написал, и решил поискать щас)
http://www.google.com.ru/search?q=loadlibrary16+35&ie=UTF-8&oe=UTF-8&h l=ru&lr=
хоть и не первоисточник, но сведения те же

>>ожидаешь именно такую ее внутреннюю функц-ть
не только ожидаю, но и имею
эта 35 ф-я работает, причем как надо в лучшем виде ;-)


 
Е-Моё имя   (2003-08-18 11:56) [10]

http://www.delphipages.com/news/detaildocs.cfm?ID=17

вот, нашел кое-что...
KERNEL32 does not export undocumented functions by name or ordinal. The only way to solve this was to read and understand the internal PE (portable executable) format specification

на чем основано утверждение-не написано ;-)
примерчик есть


 
Digitman   (2003-08-18 12:09) [11]


>
> Е-Моё имя


ну так а в чем проблема-то ?


 
Е-Моё имя   (2003-08-18 12:16) [12]

дык всё
вопрос снимается с обсуждения ;-)



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

Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
11-98534
Фдучфтвук
2003-02-09 14:27
2003.10.30
[Delphi6] чтение секторов с дискеты


1-98707
Нурик
2003-10-21 07:33
2003.10.30
Drag&Drop текста


1-98644
Brutus
2003-10-17 13:04
2003.10.30
Как создать собственный заголовок?


1-98737
senya
2003-10-20 18:09
2003.10.30
FastReport


6-98782
somik
2003-09-04 15:22
2003.10.30
Доступ по локалке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский