Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: 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 вся ветка

Текущий архив: 2007.02.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
2-1170052000
anonimousC++
2007-01-29 09:26
2007.02.18
Вопрос по си++, знаю что это форум по Делфи...


2-1170394666
Chelovek
2007-02-02 08:37
2007.02.18
Предустановка свойств нового компанента......


2-1170339522
Лебедев
2007-02-01 17:18
2007.02.18
Закладки


15-1170012791
Неудачнег
2007-01-28 22:33
2007.02.18
GetIfTable()


2-1169807186
Officeman
2007-01-26 13:26
2007.02.18
Вывод данных с TListView на Принтер