Code::Blocks & kernel32
Мне нужно получить размер RAM на машине под управлением ОС Windows. Для этого я вызываю функцию GetPhysicallyInstalledSystemMemory из библиотеки kernel32. Линковка статическая. К проекту подключена библиотека kernel32. Линковщик выдает, что ссылка на GetPhysicallyInstalledSystemMemory ему не известна. Пробовал прописывать абсолютный путь к libkernel32.a, результат тот же.
IDE Code::Blocks 12.11 with MinGW.
Помогите советом.
Код:
#include <iostream>
#include <windows.h>
//не описана в заголовочнике
extern "C" __declspec(dllimport)
BOOL __stdcall GetPhysicallyInstalledSystemMemory(PULONGLONG);
int main()
{
ULONGLONG TotalMemoryInKilobytes;
GetPhysicallyInstalledSystemMemory(&TotalMemoryInKilobytes);
std::cout << TotalMemoryInKilobytes << " kB" << std::endl;
return 0;
}
#include <windows.h>
//не описана в заголовочнике
extern "C" __declspec(dllimport)
BOOL __stdcall GetPhysicallyInstalledSystemMemory(PULONGLONG);
int main()
{
ULONGLONG TotalMemoryInKilobytes;
GetPhysicallyInstalledSystemMemory(&TotalMemoryInKilobytes);
std::cout << TotalMemoryInKilobytes << " kB" << std::endl;
return 0;
}
Код:
//Исходник в кодировке Windows-1251
#include <cstdio>
#include <windows.h>
#include <clocale>
//забыли описать в windows.h.
struct MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} ;
extern "C" __declspec(dllimport)
BOOL __stdcall GlobalMemoryStatusEx(MEMORYSTATUSEX*);
int main() {
setlocale(0,"");
MEMORYSTATUSEX msx;
msx.dwLength = sizeof (msx); //нужно задать размер структуры
if (GlobalMemoryStatusEx(&msx)) {
printf("\nДанные GlobalMemoryStatusEx:\n");
printf("Использовано ОЗУ: %lu %%\n", msx.dwMemoryLoad);
printf("Всего памяти:\n");
printf("%lu МБ (ОЗУ),\n", msx.ullTotalPhys/1024/1024);
printf("%lu МБ (подкач.),\n", msx.ullTotalPageFile/1024/1024);
printf("%lu МБ (вирт.)\n", msx.ullTotalVirtual/1024/1024);
printf("Свободная память:\n");
printf("%lu МБ (ОЗУ),\n", msx.ullAvailPhys/1024/1024);
printf("%lu МБ (подкач.),\n", msx.ullAvailPageFile/1024/1024);
printf("%lu МБ (вирт.),\n", msx.ullAvailVirtual/1024/1024);
printf("Расширенная вирт. (должна быть 0): %lu МБ\n",
msx.ullAvailExtendedVirtual/1024/1024);
} else printf("\nОшибка GlobalMemoryStatusEx\n");
return 0;
}
#include <cstdio>
#include <windows.h>
#include <clocale>
//забыли описать в windows.h.
struct MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} ;
extern "C" __declspec(dllimport)
BOOL __stdcall GlobalMemoryStatusEx(MEMORYSTATUSEX*);
int main() {
setlocale(0,"");
MEMORYSTATUSEX msx;
msx.dwLength = sizeof (msx); //нужно задать размер структуры
if (GlobalMemoryStatusEx(&msx)) {
printf("\nДанные GlobalMemoryStatusEx:\n");
printf("Использовано ОЗУ: %lu %%\n", msx.dwMemoryLoad);
printf("Всего памяти:\n");
printf("%lu МБ (ОЗУ),\n", msx.ullTotalPhys/1024/1024);
printf("%lu МБ (подкач.),\n", msx.ullTotalPageFile/1024/1024);
printf("%lu МБ (вирт.)\n", msx.ullTotalVirtual/1024/1024);
printf("Свободная память:\n");
printf("%lu МБ (ОЗУ),\n", msx.ullAvailPhys/1024/1024);
printf("%lu МБ (подкач.),\n", msx.ullAvailPageFile/1024/1024);
printf("%lu МБ (вирт.),\n", msx.ullAvailVirtual/1024/1024);
printf("Расширенная вирт. (должна быть 0): %lu МБ\n",
msx.ullAvailExtendedVirtual/1024/1024);
} else printf("\nОшибка GlobalMemoryStatusEx\n");
return 0;
}
Какой конфуз... Благодарю Вас. Вы уже в который раз разрешаете мой вопрос. Должно быть, работаете в области программирования? )
Не за что :)) Просто с WinApi еще на Delphi начинал, а там много приходилось "прикручивать", опираясь лишь на MSDN и также неполные заголовочники :(
Использовать родные средства разработки это, как я понимаю, моветон. И без секса с тулами, писанными на коленке группой неучей, процесс будет неполным.
На WinAPI и Windows-программировании свет клином не сошелся. Если только постоянно работаешь с этим, то Ms. тулы конечно предпочтительней.
Цитата: sadovoya
На WinAPI и Windows-программировании свет клином не сошелся. Если только постоянно работаешь с этим, то Ms. тулы конечно предпочтительней.
Вот-вот. В конце концов, API ОС - это, своего рода, низкоуровневый интерфейс к машине. Ядро программы может быть платформонезависимым (в идеале, даже должно быть таковым).