Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизНепонятность с динамическим импортом Найти похожие ветки
← →
Чапаев © (2006-10-08 13:19) [0]
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);
← →
Чапаев © (2006-10-08 13:26) [1]Тьфу, шайтан... Если FreeLibrary() перенести ЗА вызов функции, всё работает. Непонятно, почему тогда таким же образом импортированная WTSGetActiveConsoleSession() работает независимо от положения FreeLibrary()...
← →
Сергей М. © (2006-10-09 15:25) [2]
> программа подвисает на вызове этой функции
Что-то не видно в приведенном коде вызова этой ф-ции.
Спрашивается, чему "подвисать" при этом ?)
← →
Eraser © (2006-10-09 15:52) [3]> Непонятность с динамическим импортом
я вот динамический импорт оформляю обычно, как это сделано в 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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.049 c