Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Функция из DLL не вызывается   Найти похожие ветки 

 
dmk ©   (2006-01-10 00:46) [0]

Помогите разобраться. Функция в 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 00:54) [1]

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

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

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


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

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


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

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

Но int64 - это signed тип


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

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


 
dmk ©   (2006-01-10 01:23) [5]

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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.043 c
15-1138046238
Anatolyj
2006-01-23 22:57
2006.02.12
вывод отчета из delphi


8-1125577299
Sanctus
2005-09-01 16:21
2006.02.12
Webcam


2-1138080657
Janbolat
2006-01-24 08:30
2006.02.12
FTP-Админ как?


3-1134629133
Kodla
2005-12-15 09:45
2006.02.12
Как передать имя таблицы в процедуру?


15-1137946037
Desdechado
2006-01-22 19:07
2006.02.12
2 мучающих меня элементарных вопроса :)