I would use OpenGL instead of WinAPI , because I don’t know if WinAPI has some function like this and is too lazy to research. Yes, you can look for registry keys for this information, but this is not safe in the future due to a possible change of location / name . OpenGL Method:
- create an OpenGL rendering context
- Get the appropriate provider and device strings.
- release context rendering OpenGL
It will work for any OpenGL -enabled graphics card / driver that supports OpenGL 1.0 , which are all current cards.
You can use the OpenGL function glGetString to get this information:
GL_VENDOR Returns the company responsible for this OpenGL implementation. This name does not change from release to release. GL_RENDERER Returns the name of the renderer. This name is typically specific to a particular configuration of a hardware platform. It does not change from release to release. GL_VERSION Returns a version or release number (of supported OpenGL and gfx driver version) GL_EXTENSIONS Returns a space-separated list of supported extensions to OpenGL (all capabilities of your card)
The rest is easy (using gl_init,gl_exit from the second link):
gl_init(Your_App_Window_Handle); char *vendor =(char*)glGetString(GL_VENDOR); char *device =(char*)glGetString(GL_RENDERER); char *version=(char*)glGetString(GL_VERSION); char *ext =(char*)glGetString(GL_EXTENSIONS); gl_exit();
Mine setup returns:
vendor ="NVIDIA Corporation" device ="GeForce GTX 550 Ti/PCIe/SSE2" version="4.5.0 NVIDIA 347.25" ext ="GL_AMD_multi_draw_indirect GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage GL_ARB_conservative_depth GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_indirect GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_enhanced_layouts GL_ARB_ES2_compatibility GL_ARB_ES3_compatibility GL_ARB_ES3_1_compatibility GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_no_attachments GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_NV_internalformat_sample_query GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counters GL_ARB_shader_bit_encoding GL_ARB_shader_draw_parameters GL
[Note]
you only need to include gl.h , for this there is no need for glu,glew or anything else (except for wglext.h , which should be included in gl.h itself). Usually it is in a separate subdirectory like:
#include <gl\gl.h>
[Edit1]
As the Intel OpenGL implementation does not output the version either, I see only one option. You need to purchase the VID / PID of the PCI card ID and cross-check for known values:
Model CPU arch. Release date PCI ID Execution units HD Graphics Arrandale 2010 8086:0046 6 HD Graphics Sandy Bridge January 2011 8086:0106 6 HD Graphics 2000 Sandy Bridge January 2011 8086:0102 6 HD Graphics 3000 Sandy Bridge January 2011 8086:0116 16 HD Graphics 2500 Ivy Bridge April 2012 8086:016A 6 HD Graphics 4000 Ivy Bridge April 2012 8086:0166 16 HD Graphics 4400 Haswell 2013 20 HD Graphics 4600 Haswell 2013 8086:0416 20 HD Graphics 5500 Broadwell 2015 24
taken from here .
To get the PCI ID , you can use this:
Just change the parsing line from TEXT("USB") to TEXT("PCI") and check the VID 8086 device to:
bool PCIinfo() { int i,n; AnsiString s,txt=""; DWORD dwSize,dwPropertyRegDataType; HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; TCHAR szDesc[1024];
this code returns my setup:
PCI standard host CPU bridge PCI\VEN_1022&DEV_1400&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 0 PCI standard host CPU bridge PCI\VEN_1022&DEV_1401&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 1 PCI standard host CPU bridge PCI\VEN_1022&DEV_1402&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 2 PCI standard host CPU bridge PCI\VEN_1022&DEV_1403&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 3 PCI standard host CPU bridge PCI\VEN_1022&DEV_1404&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 4 PCI standard host CPU bridge PCI\VEN_1022&DEV_1405&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 5 PCI standard host CPU bridge PCI\VEN_1022&DEV_1410&SUBSYS_14101022&REV_00 PCI bus 0, device 0, function 0 PCI Express standard Root Port PCI\VEN_1022&DEV_1412&SUBSYS_12341022&REV_00 PCI bus 0, device 2, function 0 PCI Express standard Root Port PCI\VEN_1022&DEV_1414&SUBSYS_12341022&REV_00 PCI bus 0, device 4, function 0 PCI Express standard Root Port PCI\VEN_1022&DEV_1417&SUBSYS_12341022&REV_00 PCI bus 0, device 7, function 0 AMD IOMMU Device PCI\VEN_1022&DEV_1419&SUBSYS_14191022&REV_00 PCI bus 0, device 0, function 2 AMD SATA Controller PCI\VEN_1022&DEV_7801&SUBSYS_B0021458&REV_40 PCI bus 0, device 17, function 0 Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11 PCI bus 0, device 18, function 0 Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11 PCI bus 0, device 19, function 0 Standard Enhanced PCI to USB Host Controller PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11 PCI bus 0, device 18, function 2 Standard Enhanced PCI to USB Host Controller PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11 PCI bus 0, device 19, function 2 Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7809&SUBSYS_50041458&REV_11 PCI bus 0, device 20, function 5 AMD SMBus PCI\VEN_1022&DEV_780B&SUBSYS_780B1022&REV_14 PCI bus 0, device 20, function 0 High Definition Audio Controller PCI\VEN_1022&DEV_780D&SUBSYS_A0021458&REV_01 PCI bus 0, device 20, function 2 PCI standard ISA bridge PCI\VEN_1022&DEV_780E&SUBSYS_780E1022&REV_11 PCI bus 0, device 20, function 3 PCI standard PCI-to-PCI bridge PCI\VEN_1022&DEV_780F&SUBSYS_00000000&REV_40 PCI bus 0, device 20, function 4 AMD USB 3.0 Host Controller PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03 PCI bus 0, device 16, function 0 AMD USB 3.0 Host Controller PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03 PCI bus 0, device 16, function 1 High Definition Audio Controller PCI\VEN_10DE&DEV_0BEE&SUBSYS_35371458&REV_A1 PCI bus 1, device 0, function 1 NVIDIA GeForce GTX 550 Ti PCI\VEN_10DE&DEV_1244&SUBSYS_35371458&REV_A1 PCI bus 1, device 0, function 0 Realtek PCIe GBE Family Controller PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_06 PCI bus 2, device 0, function 0 MSI TV@Anywhere Plus PCI\VEN_1131&DEV_7133&SUBSYS_62311462&REV_D1 PCI bus 4, device 6, function 0 Etron USB 3.0 Extensible Host Controller PCI\VEN_1B6F&DEV_7023&SUBSYS_50071458&REV_01 PCI bus 3, device 0, function 0
so run it on different IntelHD graphics computers and check if another PCI identifier exists ...