Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > _GetProcessMemoryInfo@12


Автор: lexus1234567 20.11.2012, 18:39
Здравствуйте! Пытаюсь написать программу, которая считывала бы память о каком либо процессе. Использую функцию GetProcessMemoryInfo из библиотеки psapi.h. Но при компиляции вылетает ошибка линковки:
1>WorkInfo.obj : error LNK2001: неразрешенный внешний символ "_GetProcessMemoryInfo@12"
1>C:\Documents and Settings\777\Мои документы\Visual Studio 2010\Projects\ProcessInfo_new\Release\ProcessInfo.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
Странно еще то, что у меня есть старая версия программы, в которой этой ошибки нет, а код один и тот же. Может что то с настройками проекта?

Вот код файла WorkInfo.cpp (этот файл содержит в себе класс для работы с данными):
Код

#include <Psapi.h>
#pragma comment(lib, "psapi.lib")

...
if(m_sNameProc == pe32.szExeFile)
      {
          hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
         
PROCESS_MEMORY_COUNTERS pmc;
if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
              m_sMemInfo.Format(_T("%d байт"), pmc.WorkingSetSize);

Автор: volatile 20.11.2012, 23:31
линкер не может найти psapi.lib
1.проверьте путя
2.попробуйте переключить динам.<=>стат. линковка
3.очистите папку релиз/дебаг, пересоберите проект.

Автор: Dem_max 21.11.2012, 04:04
Все гораздо проще если внимательно читать MSDN

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683219(v=vs.85).aspx

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682050(v=vs.85).aspx

Автор: lexus1234567 21.11.2012, 16:31
Цитата(Dem_max @ 21.11.2012,  04:04)
Все гораздо проще если внимательно читать MSDN

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683219(v=vs.85).aspx

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682050(v=vs.85).aspx

Я читал эту статью в MSDN несколько раз, да и как в примере сказано: "add Psapi.lib to TARGETLIBS". Вот я и добавил эту либу. Только я не знаю что такое TARGETLIBS. И может надо еще dll подключить? Вы это имели ввиду?

Автор: feodorv 21.11.2012, 16:37
Наверное, Dem_max имел в виду:
Цитата

...and compile the program with -DPSAPI_VERSION=1

Автор: lexus1234567 21.11.2012, 16:55
Цитата(feodorv @ 21.11.2012,  16:37)
Наверное, Dem_max имел в виду:
Цитата

...and compile the program with -DPSAPI_VERSION=1

А как это сделать? Я пробовал это запихнуть в командную строку проекта, но мне тогда выдает компилятор ошибку. Куда деть эту строчку?

Автор: volatile 21.11.2012, 17:57
Цитата(lexus1234567 @  21.11.2012,  16:55 Найти цитируемый пост)
 -DPSAPI_VERSION=1

это просто дефайн, из коммандной строки.
тоже самое будет, если перед "#include psapi.h" поместить
#define PSAPI_VERSION 1

Автор: Dem_max 21.11.2012, 18:23
Внимательно читаем что написано на картинке

Автор: lexus1234567 21.11.2012, 19:04
Цитата(Dem_max @ 21.11.2012,  18:23)
Внимательно читаем что написано на картинке

Мне более внимательное чтение msdn ничего не даст. Все равно больше того, что я уже понял я не пойму. Так что если можете помочь, помогите, пожалуйста!

Автор: lexus1234567 22.11.2012, 20:19
Решено! Подключил dll и использовал от туда функцию. Всем спасибо большое за помощь!!!

Автор: Dem_max 19.12.2012, 19:27
Добавлю еще, 
если для RAD2010 стоит #define PSAPI_VERSION 1, это все равно не поможет, линкер будет линковать к kernel32.dll

Поможет только динамическая загрузка psapi.dll и вызов функции.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)