![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при использовании GetModuleHandle [D6, D7, WinXP]
Интересующийся © (2007-08-11 12:19:00)Всем доброе время суток
Пытаюсь вызвать функцию из своей DLL при помощи GetModuleHandle, а она мне ошибку выдает :(
Подскажите ПЛИЗ что я делаю не так
Type
TStartingProc=function: Boolean;stdcall;
Var
NameDll32:HMODULE;
StartingProc:TStartingProc;
Starting:Boolean;
Begin
NameDll32:=GetModuleHandle('NameDll32.dll');
IfNameDll32<>0 then
Begin
@StartingProc:=GetProcAddress(NameDll32,'Starting');
IfAssigned(StartingProc) ThenStarting:=StartingProc;
End;
End;
PS
как я понял в блок If прога вообще не входит по причине ошибке возникающей после строчки NameDll32:=GetModuleHandle('NameDll32.dll');
Leonid Troyanovsky (2007-08-12 19:44:00) [1]
> Интересующийся © (12.08.07 14:31) [9]
> Если сам о LoadLibrary додымал проблема вообще решилась
> бы за 10 минут, но к сожалению... :(
Соглашусь, что прочтение
http://msdn2.microsoft.com/en-us/library/ms683199.aspx
может лишь насторожить:
The module must have been loaded by the calling process.
Но, Win32Check выскажется, IMHO, гораздо определенней.
Так что, время можно отмерять в секундах.
В любом случае, Win32Check д.б. правилом.
--
Regards, LVT.
Интересующийся (2007-08-12 14:31:00) [2]> Leonid Troyanovsky © (12.08.07 09:38) [8]
> Т.е., если б ты указал хотя бы код ошибки, то выявил проблему
> не через 2.5 часа, а минут через 20.
> Так что, прошу любить и пользовать Win32Check
На счет Win32CheckВЫ полностью правы :)
Если сам о LoadLibraryдодымал проблема вообще решилась бы за 10 минут, но к сожалению... :(
Leonid Troyanovsky (2007-08-12 09:38:00) [3]
> Интересующийся © (11.08.07 16:23) [4]
> Я непонял зачем ее использовать в коде который не вызывает
> ощибки о которой необходимо предупреждать пользователя
Как же не надо предупреждать?
Вот, даже нас не ты предупредил.
Большинство win32 API - функции (в понимании паскаля),
возвращаемый результат которых принято анализировать,
в т.ч. и с использованием GetLastError.
Т.е., если б ты указал хотя бы код ошибки, то выявил проблему
не через 2.5 часа, а минут через 20.
Так что, прошу любить и пользовать Win32Check.
--
Regards, LVT.
Интересующийся (2007-08-11 18:35:00) [4]> trubin © (11.08.07 16:56) [5]
> trubin © (11.08.07 16:58) [6]
О LoadLibrary я и не подумал :(
Вставил, все ЗАРАБОТАЛО!
За подсказку РЕСПЕКТ :)
trubin (2007-08-11 16:58:00) [5]
> Тот код который я привел брался из стандартного примера
> вызова функции из Kernel32.dll и работает прекрасно, в моем
> же случае блок кода If... отказывается работать (как я понимаю
> по какой-то причине код неможет получить указатель моей
> DLL)
Kernel32.dll присутствует в любом процессе, поэтому пример и работает
trubin (2007-08-11 16:56:00) [6]The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process.
LoadLibrary делал?
Интересующийся (2007-08-11 16:23:00) [7]> Функция в SysUtils - если NameDll32 = 0, то вызовет ф-ю RaiseLastWin32Error, которая возбудит исключение и выдаст сообщение об ошибке. См Ф1 + сусУтилс.пас ;)
Ну насчет SysUtils это я понял, и насчет для чего она нужна смотрел по F1
Я непонял зачем ее использовать в коде который не вызывает ощибки о которой необходимо предупреждать пользователя
Тот код который я привел брался из стандартного примера вызова функции из Kernel32.dll и работает прекрасно, в моем же случае блок кода If... отказывается работать (как я понимаю по какой-то причине код неможет получить указатель моей DLL)
В настоящее время я подключаю DLL не денамически, но меня такой способ не устраивает, поскольку по условиям согласно которым разрабатывается приложение DLL может отсутствовать
PS
Мне нужно динамически загрузить процедуры и функции из моей DLL в мое приложение. Если у кого есть рабочие примеры ПЛИЗ поделитесь кодом
trubin (2007-08-11 15:18:00) [8]
> Насчет Win32Check не понял, можно по подробней
Функция в SysUtils - если NameDll32 = 0, то вызовет ф-ю RaiseLastWin32Error, которая возбудит исключение и выдаст сообщение об ошибке. См Ф1 + сусУтилс.пас ;)
Интересующийся (2007-08-11 13:15:00) [9]Насчет Win32Check не понял, можно по подробней
Leonid Troyanovsky (2007-08-11 12:46:00) [10]
> Интересующийся © (11.08.07 12:19)
> If NameDll32<>0 then
Win32Check(NameDll32<>0);
--
Regards, LVT.