Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция из DLL не вызывается [D7, WinXP]


dmk ©   (2006-01-10 00:46:00) 

Помогите разобраться. Функция в DLL существует,
а при вызове возвращает код ошибки 87 (ERROR_INVALID_PARAMETER)
В общем вызова не происходит.
Может структуру неправильно описал?

program NewMemTest;

uses
 Forms,
 new_i in 'new_i.pas' {MemForm},
 windows in 'windows.pas',
 dialogs in 'dialogs.pas',
 sysutils in 'sysutils.pas';

{$R *.RES}

type
 PMemoryStatusEx = ^TMemoryStatusEx;
 _MEMORYSTATUSEX = record
   dwLength: DWORD;
   dwMemoryLoad: DWORD;
   dwTotalPhys: INT64;
   dwAvailPhys: INT64;
   dwTotalPageFile: INT64;
   dwAvailPageFile: INT64;
   dwTotalVirtual: INT64;
   dwAvailVirtual: INT64;
 end;
 TMemoryStatusEx = _MEMORYSTATUSEX;

type
 TGetMemoryExProc = Function(var lpBuffer: TMemoryStatusEx): BOOL; StdCall;

{
 DWORD dwLength;
 DWORD dwMemoryLoad;
 DWORDLONG ullTotalPhys;
 DWORDLONG ullAvailPhys;
 DWORDLONG ullTotalPageFile;
 DWORDLONG ullAvailPageFile;
 DWORDLONG ullTotalVirtual;
 DWORDLONG ullAvailVirtual;
 DWORDLONG ullAvailExtendedVirtual;
}

var
 Handle: THandle;
 ResStr: string;
 MemStatusRecEx: TMemoryStatusEx;
 GetMemEx: TGetMemoryExProc;
 AllocSize: Int64;
 GetRes: Boolean;
 ErrCode: DWord;

begin
 Handle := LoadLibrary(PChar(kernel32));
 if Handle <> 0 then
   begin
     @GetMemEx := GetProcAddress(Handle, 'GlobalMemoryStatusEx');
     if (@GetMemEx = nil) then
       begin
         MessageDlg('Call failed. ''GlobalMemoryStatusEx''', mtError, [mbOk], 0);
         FreeLibrary(Handle);
         Exit;
       end;

     GetRes := GetMemEx(MemStatusRecEx);
     If GetRes then
       begin
        AllocSize := MemStatusRecEx.dwAvailPhys;
        ResStr := FloatToStrF(AllocSize / 1024 / 1024, ffNumber, 18, 2) + ' Mb';
        MessageDlg(ResStr, mtError, [mbOk], 0);
       end
     else
       begin
         ErrCode := GetLastError;
         MessageDlg('Error is: ' + IntToStr(ErrCode), mtError, [mbOk], 0);
       end;
       FreeLibrary(Handle);
       Exit;

   end
  else Exit;

 //...

 Application.Initialize;
 Application.Title := 'FreeMem';
 Application.CreateForm(TMemForm, MemForm);
 Application.Run;

 //...

 FreeLibrary(Handle);
end.


dmk   (2006-01-10 01:23:00) [1]

Спасибо Вам огромное.
Невнимательность =(

PS. Все работает.


Reindeer Moss Eater   (2006-01-10 01:14:00) [2]

> cтруктура перед вызовом не проинициализирована.
перед вызовом в dwLength следует записать длину структуры.


Reindeer Moss Eater   (2006-01-10 01:04:00) [3]

Для описания структуры ничего подходящего на замену DWORDLONG, кроме Int64, не нашел.

Но int64 - это signed тип


Reindeer Moss Eater   (2006-01-10 01:01:00) [4]

Навскидку:
cтруктура перед вызовом не проинициализирована.


dmk   (2006-01-10 00:54:00) [5]

В MSDN она описывается так
BOOL GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer);

структуру LPMEMORYSTATUSEX видно в коде.

Для описания структуры ничего подходящего на замену DWORDLONG, кроме Int64, не нашел.


Наверх

Титульная страница Поиск, карта сайта Написать письмо