Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2014, 19:12   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Как использовать сторонние функции из внешнего хидера (*function)(arg1,arg2);

Что-то я не понимаю, как это работает. Подключен внешний .h файл со своими функциями,структурами и т.д.
Код:
#include <nvapi.h>
Теперь нужно вызвать из него функцию:
Код:
(*NvAPI_Initialize)();
Эта запись эквивалентна NVAPI_INTERFACE NvAPI_Initialize();
Далее функция,использующая структуру и аргументы:
Код:
NVAPI_INTERFACE NvAPI_GPU_GetMemoryInfo(NvPhysicalGpuHandle hPhysicalGpu, NV_DISPLAY_DRIVER_MEMORY_INFO *pMemoryInfo);
Для первого параметра создается числовая переменная:
int *gpuHandles[NVAPI_MAX_PHYSICAL_GPUS]={NULL};
А что делать со структурой? Нужно создавать свою структуру внутри программы, затем делать так: mystructure= new NV_DISPLAY_DRIVER_MEMORY_INFO?
calypso вне форума Ответить с цитированием
Старый 02.06.2014, 19:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну я думаю как-то так:
Код:
NV_DISPLAY_DRIVER_MEMORY_INFO *pMemoryInfo=new NV_DISPLAY_DRIVER_MEMORY_INFO;
...
NvAPI_GPU_GetMemoryInfo(Тут первый парам, pMemoryInfo);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.06.2014, 18:46   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Сделал на Visual C++, почему-то работают все функции кроме этой злосчастной GetMemoryInfo.
Код:
NvAPI_ShortString Branchstring;
NvU32 DriverVersion;
NvAPI_SYS_GetDriverAndBranchVersion(&DriverVersion,Branchstring);
Работает.
Цитата:
NvU32 cnt;
NvPhysicalGpuHandle phys;
NvAPI_EnumPhysicalGPUs(&phys,&cnt);
Работает.
Цитата:
NvAPI_ShortString name;
NvAPI_GPU_GetFullName(phys,name);
Работает.
Цитата:
NV_DISPLAY_DRIVER_MEMORY_INFO* pamyatGPU=new NV_DISPLAY_DRIVER_MEMORY_INFO;
NvAPI_GPU_GetMemoryInfo(phys, pamyatGPU);
UInt32 videomemory=pamyatGPU->systemVideoMemory;
UInt32 vers=pamyatGPU->version;
Не работает.
calypso вне форума Ответить с цитированием
Старый 05.06.2014, 20:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А в чем выражается это "неработает"?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 13:42   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Выдает ошибку,что несовместимая структура. Собственно уже 2-ю неделю тормознулся на этом месте и дальше никак.
Смысл в том,что функция GetMemoryInfo работает со структурой NV_DISPLAY_DRIVER_MEMORY_INFO. В самом nvapi.h если его посмотреть, такой структуры нет. Зато есть NV_DISPLAY_DRIVER_MEMORY_INFO_V1 и NV_DISPLAY_DRIVER_MEMORY_INFO_V2. Нужно скорее всего первая.

И задача - сконвертировать структуру NV_DISPLAY_DRIVER_MEMORY_INFO в NV_DISPLAY_DRIVER_MEMORY_INFO_V1. Или наоборот.
Трудно сказать, почему Нвидиа так сделали всё через одно место...
calypso вне форума Ответить с цитированием
Старый 09.06.2014, 14:29   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Документацию читать не пробовали?

Написано, что надо делать так:
NV_DISPLAY_DRIVER_VERSION version = {0};
version.version = NV_DISPLAY_DRIVER_VERSION_VER;

status = NvAPI_GetDisplayDriverVersion(NVAPI _DEFAULT_HANDLE, &version);

И, кстати, написано, что эта функция объявлена obsolete.
waleri на форуме Ответить с цитированием
Старый 09.06.2014, 18:05   #7
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Причем тут NV_DISPLAY_DRIVER_VERSION, если речь о структуре NV_DISPLAY_DRIVER_MEMORY_INFO?
Вот кое-что интересное нашел, правда на немецком:
http://www.entwickler-ecke.de/printv...05dbac8c101c08

В целом понятно. Чувак написал на Делфи программу со всеми функциями, и у него тоже вылазила это чертова ошибка
Цитата:
Bei NvAPI_GPU_GetUsages und NvAPI_GPU_GetMemoryInfo bekommt man die Fehlermeldung NVAPI_INCOMPATIBLE_STRUCT_VERSION.
Решилась проблема вводом констант:
const
NV_GPU_USAGES_VER = NvU32(SizeOf(NV_USAGES) or ($10000));
NV_GPU_MEMORY_INFO_VER = NvU32(SizeOf(NV_MEMORY_INFO) or ($20000));
NV_GPU_COOLER_SETTINGS_VER = NvU32(SizeOf(NV_COOLER_SETTINGS) or ($20000));
NV_GPU_COOLER_LEVELS_VER = NvU32(SizeOf(NV_GPU_COOLER_LEVELS) or ($10000));
Но это для Делфи. А у меня C++ и этих констант вообще нет.
calypso вне форума Ответить с цитированием
Старый 09.06.2014, 18:55   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

NV_DISPLAY_DRIVER_MEMORY_INFO info;
info.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER;
...
NvAPI_GPU_GetMemoryInfo(Тут первый парам, &info);
waleri на форуме Ответить с цитированием
Старый 09.06.2014, 22:55   #9
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Да, получилось наконец. А то бы я ещё полгода ковырялся))
Код:
NV_DISPLAY_DRIVER_MEMORY_INFO gpuMemoryInfo;
gpuMemoryInfo.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER;
status=NvAPI_GPU_GetMemoryInfo(phys, &gpuMemoryInfo);
NvAPI_GetErrorMessage(status,errorDesc);
MessageBox::Show("Результат запроса функции GetMemoryInfo: "+Marshal::PtrToStringAnsi((IntPtr) (char *) errorDesc));
Результат NVAPI_OK
Код:
UInt32 videomemory=gpuMemoryInfo.curAvailableDedicatedVideoMemory;
UInt32 vers=gpuMemoryInfo.version;
MessageBox::Show("Свободно видеопамяти: "+Convert::ToString(videomemory)+"МБ ,Версия: "+Convert::ToString(vers));
calypso вне форума Ответить с цитированием
Старый 11.06.2014, 18:42   #10
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Добьем тему до конца, опять мучаю NVAPI, теперь на Delphi и использую динамический импорт функций. Загружаю DLL, затем GetProcAddress и nvapi_QueryInterface. Ну вообщем понятно, не буду на этом заострять внимание.
Код:
const
  NvAPIFunctions: array[0..67] of TNvAPIFuncRec = (
    (ID: $6C2D048C; Func: @@NvAPI_GetErrorMessage),
    <...>
    (ID: $5F608315; Func: @@NvAPI_GPU_GetTachReading),
    (ID: $774AA982; Func: @@NvAPI_GPU_GetMemoryInfo),
    (ID: $DA141340; Func: @@NvAPI_GPU_GetCoolerSettings),

    (ID: 0; Func: nil) // stop signal
  );
Тут тоже всё понятно. Работает GPUName, GetMemoryInfo, температуру видеокарты тоже показывает. А вот эти 2 функции оказали жесткое сопротивление:
Прототипы:
Код:
  NvAPI_GPU_GetCoolerSettings: function(hPhysicalGpu: PNvPhysicalGpuHandle; CoolerIndex: integer; NvCoolerSettings: PNvCoolerSettings): NvApi_Status; cdecl;
Код:
NvAPI_GPU_GetTachReading: function (hPhysicalGpu: PNvPhysicalGpuHandle; PValue: NvU32 ): NvApi_Status; cdecl;
Непосредственно тела функций:
Код:
    // ****************** FAN SPEED ******************* //
     Status:= NvAPI_GPU_GetTachReading(Phys[n], nSpeed);
     if Status = NVAPI_OK then
     begin
      ShowMessage('NvAPI_GPU_GetTachReading отработала успешно');
      gpufanspeed:='Fan Speed: '+ IntToStr(nSpeed);
     end
     else
      begin
      NvAPI_GetErrorMessage(Status,oshibka);
      ShowMessage('При вызове NvAPI_GPU_GetTachReading сбой: '+oshibka+'status='+IntToStr(Integer(status)));
      end ;
Status -5 , INVALID ARGUMENT
Код:
   // ***************** COOLER INFO ****************** //
     FillChar(Cooler, SizeOf(Cooler), 0);
     Cooler.Version:= NV_GPU_COOLER_SETTINGS_VER;
     Status:= NvAPI_GPU_GetCoolerSettings(Phys[n], 0, @Cooler);
     if Status = NVAPI_OK then
     begin
      ShowMessage('NvAPI_GPU_GetCoolerSettings отработала успешно');
      gpucooler:='Cooler: '+ IntToStr(Cooler.Cooler[0].CurrentLevel);
     end
     else
      begin
      NvAPI_GetErrorMessage(Status,oshibka);
      ShowMessage('При вызове NvAPI_GPU_GetCoolerSettings сбой: '+oshibka+'status='+IntToStr(Integer(status)));
      end ;
Status -9 , несовместимая структура

Сначала думал,может видеокарта не поддерживает датчики вентилятора. Но GPU-Z всё отображает нормально
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать UNICODE функции? dolphin705 Общие вопросы Delphi 6 04.04.2013 00:21
Как использовать функции для формирования ссылок в формулах? Buchhalter Microsoft Office Excel 5 24.08.2012 18:29
Можно ли задать глобальную переменную из функции или как-то напрямую использовать память для хранения переменных из функции? Suny-o Общие вопросы Delphi 2 14.06.2012 11:45
Как в Си использовать двумерный массив в качестве аргумента функции? Hornet_nsk Помощь студентам 7 05.02.2012 09:46
Как использовать функции FindWindow и CloseWindow? __Demon__ Общие вопросы C/C++ 4 14.08.2009 15:29