![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция из 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, не нашел.