Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.037 c
2-1138094136
Kabazoo
2006-01-24 12:15
2006.02.12
Снова первый и последний день ...


4-1133198140
volser
2005-11-28 20:15
2006.02.12
Hooks &amp; COM


1-1136886695
OceanGirl
2006-01-10 12:51
2006.02.12
RichEdit, Protected текст


2-1138288528
_Tirex_
2006-01-26 18:15
2006.02.12
зависание проги при чтении из файла в цикле


8-1125205449
zeram
2005-08-28 09:04
2006.02.12
Работа с gif (изменение цвета).




   Наверх