Вниз
Скачать: CL | DM;

Непонятность с динамическим импортом   Найти похожие ветки 

← →
Чапаев ©   (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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.03 c
4-1160040203
ildarkh
2006-10-05 13:23
2007.02.18
Запуск программы из службы


4-1159539919
Dmitry_177
2006-09-29 18:25
2007.02.18
Кнопка на API


2-1169915126
Garacio
2007-01-27 19:25
2007.02.18
Отдельный поток


15-1169582407
SkySpeed
2007-01-23 23:00
2007.02.18
Эт чё, каждому пользователю MAIL.RU - ящик по 5 гиг? %)


15-1169742840
apak
2007-01-25 19:34
2007.02.18
А что будет если




   Наверх