Getting full name and usage of gpu using nvapi

1.1k views Asked by At

i am trying to get the full name of my gpu and my gpu usage using nvapi.dll. i have encounter this post on this website: C# Performance Counter Help, Nvidia GPU.

he uses 2 sources, one in the dll itself (for getting the usage) and for full name he uses the header file of nvapi downloaded from the nevidia website.

There is any way i can avoid this duplication in my project? using only the dll or using only the header files brought by nevidia. Thanks for all the helpers

2

There are 2 answers

7
Ali Bigdeli On

you can load DLL file dynamically when you need it,

in c# you can use .Net Reflection (if dll is developed in .Net framework), for example :

var DLL = Assembly.LoadFile(@"path\to\your.dll");

Type t = DLL.GetType("myAssembly.ClassName");
CustomType result = t.InvokeMember("methodName", BindingFlags.InvokeMethod, null, t, new object[] { @"method argument" }); 

if mentioned dll is not developed under .Net framework but you are forced to use .Net framework (for more information see this) :

int hModule = LoadLibrary(@"path\to\your.dll");
if (hModule == 0) return false;
IntPtr intPtr = GetProcAddress(hModule, "yourmethod_PTR");

if you want to use in c/c++ you can use following code :

HINSTANCE hGetProcIDDLL = LoadLibrary("path\\to\\your.dll");

if (hGetProcIDDLL == NULL) {
   std::cout << "dll not found" << std::endl;
} 

int a = function_to_call("arguments");

NOTE: if you want to load dll from unknown source I recommend to use c/c++, because in c/c++ you can manage your memory easier and free all your resources after dll loading,

0
eliyahu levi On

I have found the list of functions id in https://github.com/processhacker/plugins-extra/blob/master/NvGpuPlugin/nvidia.c

In addition to http://eliang.blogspot.com/2011/05/getting-nvidia-gpu-usage-in-c.html

i declared typedef int(*nvAPI_GPU_getFullName_t)(int *handle , char* name); nvAPI_GPU_getFullName_t nvAPI_GPU_getFullName=NULL; nvAPI_GPU_getFullName=(nvAPI_GPU_getFullName_t)(*NvAPI_QueryInterface)(0xCEEE8e9FUL);