Форум: "Основная";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
ВнизФункция из 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c