Главная страница
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.046 c
15-1138013180
DmitriyR
2006-01-23 13:46
2006.02.12
Дали задание написать простой E-Mail сервер


2-1138003865
mctarik
2006-01-23 11:11
2006.02.12
Писал ли кто нибудь Инструменты к Дельфи!


11-1119341023
RA
2005-06-21 12:03
2006.02.12
Обработка сообщений в Graph-контролах


2-1138273981
CyMKuH
2006-01-26 14:13
2006.02.12
Как "вырвать" иконку из DLL и сохранить в "*.ico"


3-1134659156
Виталий Панасенко
2005-12-15 18:05
2006.02.12
Портирование кода с BDE на ADO