![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятность с динамическим импортом
Чапаев © (2006-10-08 13:19:00)
function WTSQueryUserToken(SessionId:Cardinal;var Token:THandle):BOOL;stdcall;external 'wtsapi32.dll';работает нормально. Однако при попытке динамически импортировать данную функцию программа подвисает на вызове этой функции. Использую такой код:
type
TQueryUserToken=function(SessionId:Cardinal;var Token:THandle):BOOL;stdcall;
var
WTSQueryUserToken:TQueryUserToken;
begin
Lib:=LoadLibrary('wtsapi32.dll');
if Lib=0 then
raise Exception.Create('Unable to load library');
@WTSQueryUserToken:=GetProcAddress(Lib,'WTSQueryUserToken');
if @WTSQueryUserToken=nil then
raise Exception.Create('Unable to import function');
FreeLibrary(Lib);
Eraser (2006-10-09 15:52:00) [1]> Непонятность с динамическим импортом
я вот динамический импорт оформляю обычно, как это сделано в WinAPI джедаев, т.е. например:
объявление
function WTSQueryUserToken(SessionId: ULONG; var phToken: HANDLE): BOOL; stdcall;
реализация
{$IFDEF DYNAMIC_LINK} // DYNAMIC_LINK должна быть включена!
var
_WTSQueryUserToken: Pointer;
function WTSQueryUserToken;
begin
GetProcedureAddress(_WTSQueryUserToken, wtsapi, 'WTSQueryUserToken');
asm
mov esp, ebp
pop ebp
jmp [_WTSQueryUserToken]
end;
end;
{$ELSE}
function WTSQueryUserToken; external wtsapi name 'WTSQueryUserToken';
{$ENDIF DYNAMIC_LINK}
получение адреса/загрузка функции
procedure GetProcedureAddress(var P: Pointer; const ModuleName, ProcName: string);
var
ModuleHandle: HMODULE;
begin
if not Assigned(P) then
begin
ModuleHandle := GetModuleHandle(PChar(ModuleName));
if ModuleHandle = 0 then
begin
ModuleHandle := LoadLibrary(PChar(ModuleName));
if ModuleHandle = 0 then raise EJwaLoadLibraryError.Create('Library not found: ' + ModuleName);
end;
P := GetProcAddress(ModuleHandle, PChar(ProcName));
if not Assigned(P) then raise EJwaGetProcAddressError.Create('Function not found: ' + ModuleName + '.' + ProcName);
end;
end;
Сергей М. (2006-10-09 15:25:00) [2]
> программа подвисает на вызове этой функции
Что-то не видно в приведенном коде вызова этой ф-ции.
Спрашивается, чему "подвисать" при этом ?)
Чапаев (2006-10-08 13:26:00) [3]Тьфу, шайтан... Если FreeLibrary() перенести ЗА вызов функции, всё работает. Непонятно, почему тогда таким же образом импортированная WTSGetActiveConsoleSession() работает независимо от положения FreeLibrary()...