Oppure

Loading
10/05/10 7:15
mattia86
Buongiorno a tutti e complimenti per il forum!

Purtroppo ho un grosso problema che mi ha portato alla disperazione dopo 3 giorni di tentativi veniamo al dunque.

Ho una dll esterna che mi permette, tramite una funzione, di estrarre la temperatura della cpu ( e molti altri dati, per ora considero questo per semplicità;). Il problema è che non riesco a dichiararla e a passarci i valori giusti.

Nella specifica della dll c'è scritto questo :

BOOL SusiHWMGetTemperature(WORD tempType, float *retval, WORD *typeSupport = NULL);

Parameters

tempType

[in]Specifies a temperature sensor to get value from. It can be one of the flags 

TCPU (1) – CPU temperature 

TSYS (2) – System / ambient temperature 

retval

[out]Point to a variable in which this function returns the temperature in Celsius.

Typesupport 

[out]

If the value is specified as a pointer (non-NULL) to a variable, it will return the types of available sensors in flags bitwise-ORed

Return Value

TRUE (1) indicates success; FALSE (0) indicates failure



In un progetto di esempio sviluppato in C# (di cui io non capisco una cippa, o quasi), la funzione è utilizzata in questo modo :

[DllImport("Susi.dll")]
    public unsafe static extern bool SusiHWMGetTemperature(UInt16 tempType, float* retval, UInt16* typeSupport);

float[] temp = new float[3];

fixed (float* pfT = temp)
        for (ushort m = 0, j = 1; j < (1 << 3); j <<= 1)
        {
          if (0 != (j & u16TempSupport))
          {
            if (!SusiHWMGetTemperature(j, pfT + m, null))
            {
              MessageBox.Show("SusiHWMGetTemperature failed! " + "ErrorCode = " + SusiDllGetLastError().ToString());
              return;
            }
          }

          m++;
        }


In questo modo ovviamente, inserendo temp[1] in una textbox, ottengo la temperatura del sistema.... io in vb ho provato a fare così : (fa anche rima)

'Importo la funzione dalla dll
<DllImport("Susi.dll")> _
  Public Shared Function SusiHWMGetTemperature(ByVal tempType As UInt16, ByRef retval As Single, ByRef typeSupport As UInt16) As Boolean
  End Function

Dim Temperatura As Single = 0

'richiamo la funzione per l'estrazione della temperatura e verifico che il valore restituito sia true (infatti lo è)
Trace.WriteLine(PCM3362.SusiHWMGetTemperature(1, Temperatura, Nothing).ToString)

'aggiorno il valore della textbox
Me.TextBoxTemperaturaCPU.Text = Temperatura.ToString


A questo punto la textbox e la variabile conterranno sempre il valore 0! non capisco proprio il perchè! Ho cercato di prendere e convertire semplicemente tutto ciò che è stato sviluppato in C# in VB!

Help please! :hail:

Saluti

aaa
10/05/10 8:16
Il Totem
In teoria, è giusto... Se proprio non funziona, prova a passare al posto di single un puntatore (IntPtr in vb) ad un'area di memoria allocata con Marshal.AllocHGlobal. Poi ne leggi il valore.
Anche se mi sembra strano: con il byref dovrebbe funzionare correttamente.
aaa