Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11660
Последний выпуск: 19.06.2015

Code::Blocks & kernel32

27K
26 июля 2014 года
mnanorn
78 / / 01.12.2013
Здравствуйте!

Мне нужно получить размер RAM на машине под управлением ОС Windows. Для этого я вызываю функцию GetPhysicallyInstalledSystemMemory из библиотеки kernel32. Линковка статическая. К проекту подключена библиотека kernel32. Линковщик выдает, что ссылка на GetPhysicallyInstalledSystemMemory ему не известна. Пробовал прописывать абсолютный путь к libkernel32.a, результат тот же.

IDE Code::Blocks 12.11 with MinGW.

Помогите советом.
286
26 июля 2014 года
sadovoya
757 / / 19.11.2005
Код:
#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;
}
286
26 июля 2014 года
sadovoya
757 / / 19.11.2005
Это, как часто бывает, недочет в заголовочниках системных библиотек. Иногда кроме функции еще и структуры самому описывать приходится, которые часто тоже в заголовочниках забывают. Вот как раз такой пример, думаю он тоже вам будет интересен, раз речь о памяти. Кстати предыдущий только начиная с Vista SP1 работать должен. Этот более универсален.

Код:
//Исходник в кодировке 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;

}
27K
26 июля 2014 года
mnanorn
78 / / 01.12.2013
Какой конфуз... Благодарю Вас. Вы уже в который раз разрешаете мой вопрос. Должно быть, работаете в области программирования? )
286
26 июля 2014 года
sadovoya
757 / / 19.11.2005
Не за что :)) Просто с WinApi еще на Delphi начинал, а там много приходилось "прикручивать", опираясь лишь на MSDN и также неполные заголовочники :(
229
27 июля 2014 года
Ramon
1.0K / / 16.08.2003
Использовать родные средства разработки это, как я понимаю, моветон. И без секса с тулами, писанными на коленке группой неучей, процесс будет неполным.
286
27 июля 2014 года
sadovoya
757 / / 19.11.2005
На WinAPI и Windows-программировании свет клином не сошелся. Если только постоянно работаешь с этим, то Ms. тулы конечно предпочтительней.
27K
28 июля 2014 года
mnanorn
78 / / 01.12.2013
Цитата: sadovoya
На WinAPI и Windows-программировании свет клином не сошелся. Если только постоянно работаешь с этим, то Ms. тулы конечно предпочтительней.



Вот-вот. В конце концов, API ОС - это, своего рода, низкоуровневый интерфейс к машине. Ядро программы может быть платформонезависимым (в идеале, даже должно быть таковым).

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог