Newsgroup: it.comp.lang.c++
Titolo: GetNumberOfPhysicalMonitorsFromHMONITOR

premesso che di C - C++ e derivati ne capisco pochino e nella mia vita ho 
fatto poche cose in questo linguaggio, mi sono imbattuto in un problema che 
in vbnet sembra insormontabile. Ho la necessita di dover regolare la 
luminisota di un monitor touch screen tramite un cursore selezionato 
dall'utente. Quella che segue ovviamente non è frutto del mio sacco e 
l'autore della cosa dice che funziona perfettamente. Io l'ho dovuto inserire 
in una DLL che dovrò richiamre in vb passando il valore del cursore per 
selezionare la luminosita. Al momento mancano ancora le funzioni di lettura 
dei valori del monitor GetMonitorBrightness e SetMonitorBeightness. Il 
problema e che non so se funziona per il semplice motivo che il compilatore 
non riesce a compilarla dandomi questi 2 errori
Error	1	error LNK2019: unresolved external symbol 
_GetPhysicalMonitorsFromHMONITOR@12 referenced in function _GetMonitorHandleExportDll.obj	ExportDllError	2	error LNK2019: unresolved external symbol 
_GetNumberOfPhysicalMonitorsFromHMONITOR@8 referenced in function 
_GetMonitorHandle	ExportDll.obj	ExportDll
da quello che ho capito sembra che non riesce a trovare le funzioni 
nell'header file eppure da MSDN i 2 file da includere sono quelli e quindi 
non riesco a capire il problema. Non vorrei aver dimenticato qualche virgola 
o punto e virgola da qualche parte ma non riesco a trovare niente di simile.
Mi trovo e vi chiedo anche un'altra cosina. Perchè alcuni include sono tra 
virgolette e altri tra <>. E solo una questione di come si alza uno la 
mattina e di come decide quale utilizzare, faccio la domanda perche a me 
piacerebbe inserirli tra qualche cosa di carino del tipo un bel disegnino. 
(scherzo ovviamente, ma non so la differenza). Vi prego di non deridermi.
qui siamo solo alla compilazione, immagino cosa succederà nel momento in cui 
dovro inserire anche il parametro e mandarlo in esecuzione, Son sicuro che 
ne verra fuori un'eccezione del tipo "deficiente ma cosa hai scritto".
So che qualche anima pia prendera a cuore la cosa ma vi prego di andare 
cauti nel senso.....non mi scrivete cose del tipo:
"lpstrzhanzuw non va bene in quella posizione perche l'handle si è avvolto 
nel task e di conseguenza il dword è andato in conflitto con il malloc della 
memoria fisica, mentre quella virtuale è andata in conflitto con quella 
spirituale"
grazie a tutti.
#include "stdafx.h"
#include <Windows.h>
#include <HighLevelMonitorConfigurationAPI.h>
#include <PhysicalMonitorEnumerationAPI.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
extern "C" BOOL GetMonitorHandle()
{
	HWND hwnd;
	HMONITOR hmon;
	hwnd = GetDesktopWindow();
	hmon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY);
                BOOL result;
	DWORD cPhysicalMonitors;
	LPPHYSICAL_MONITOR pPhysicalMonitors = NULL;
	result = GetNumberOfPhysicalMonitorsFromHMONITOR(hmon, &cPhysicalMonitors);
	pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(
		cPhysicalMonitors* sizeof(PHYSICAL_MONITOR));
	result = GetPhysicalMonitorsFromHMONITOR(
		hmon, cPhysicalMonitors, pPhysicalMonitors);
//printf("Physical Monitor Handle: %x\n", 
pPhysicalMonitors[0].hPhysicalMonitor);
//wprintf(L"Physical Monitor Name: 
%s\n",pPhysicalMonitors[0].szPhysicalMonitorDescription);
	free(pPhysicalMonitors);
	return 0;
}
 

 nell'header file
No, non e' quello l'errore.
L'header file contiene solo i prototipi (ossia le dichiarazioni) di 
queste funzioni. Se usi una funzione senza dichiararne i prototipi viene 
emesso un altro tipo di messaggio.
Qui ti segnala che il linker non riesce a trovare i corpi (ossia le 
definizioni) di tali funzioni. Il corpo di una funzione si trova o in un 
file sorgente da compilare o in una libreria. Ovviamente nel tuo caso, 
si trovano in una libreria che non hai passato al linker.
Se guardi la documentazione online di 
GetNumberOfPhysicalMonitorsFromHMONITOR Function
trovi, nella sezione Requirements (a sfondo grigio): Library Dxva2.lib
Significa che nella riga di comando devi aggiungere Dxva2.lib, che 
verra' passato al linker. Se tale file non e' insieme agli altri file di 
libreria, devi anche indicare la sua directory tra quelle in cui il 
linker cerca le librerie.
-- 
Carlo Milanesi
http://carlomilanesi.wordpress.com/

 ha scritto nel messaggio 
news:4d81d522$0$6833$5fc...@news.tiscali.it...

Grazie Carlo per la cortese risposta ovviamente capito perfettamente il 
problema anche se non so dove andare a parare, mi spiego
come prima cosa lavoro con VS2008 ho fatto una ricerca ma non riesco a 
trovare la libreria in questione ho guardato in tutte le cartelle ed esiste 
solo la dll Dxva2 in system32
Il fatto che anche se la trovo non so dove e come andarla a dichiarare. So 
perfettamente che sono cose che non si dovrebbero nemmeno chiedere ma non ho 
vergogna a farlo.
Nel progetto ci sono 3 cartelle
Header files con :
    resorce.h
    stdafx.h
    targetver.h
Resorces Files
    ExportDll.rc
    ExportDll.rc2
Source Files
    dllMain.cpp (la main della dll)
    ExportDll.cpp (il mio sorgente)
    ExportDll.def (dove vado a dichiarare le varie funzioni presenti nella 
dll)
il problema e che non so nemmeno dove si trovano gli altri header file del 
tipo windows.h
faccio la ricerca ma non li trova.
Se mi dai una dritta ti ringrazio
enzo
 


Bada che in questo newsgroup non si dovrebbe parlare di argomenti 
strettamente dipendenti da un singolo sistema operativo o compilatore.
Per tali questioni dovresti rivolgerti a gruppi Microsoft o al gruppo 
it.comp.programmare.win32 (che nonostante il nome non tratta solo di 
sistemi a 32 bit).
Ma per questa volta faccio uno strappo.
Sul mio computer il file windows.h si trova nelle directory:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
mentre il file dxva2.lib si trova nelle directory:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
e
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64
Ovviamente quest'ultimo e' per il codice a 64-bit.
In realta' quei due file contengono solo dei riferimenti alle vere routine.
Queste ultime si trovano nel file C:\Windows\System32\dxva2.dll.
Non devi spostare nessun file.
Per linkare devi far trovare al linker il file dxva2.lib.
In fase di esecuzione, il programma o libreria risultante tentera' di 
caricare il file dxva2.dll, che quindi si dovra' trovare nel computer su 
cui si esegue il programma.
Credo che la directory citata per le librerie sia gia' usata dal linker, 
quindi devi solo aggiungere la stringa " dxva2.lib" alla lista delle 
librerie aggiuntive usate dal linker.
