Главная страница
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.07 c
3-1163486640
sapsi
2006-11-14 09:44
2007.02.18
Высота строк в ДБ гриде


2-1170325449
inkvizitor
2007-02-01 13:24
2007.02.18
Опять Мемо!!!


15-1170137781
КиТаЯц
2007-01-30 09:16
2007.02.18
Является ли грехом использование взломанных версий? :)


3-1164220973
TauRus1
2006-11-22 21:42
2007.02.18
мультивыбор в dbgride


15-1169640740
NLex
2007-01-24 15:12
2007.02.18
Прикольный робот.... !!!