Hallo Squeakers,

ich möchte aus Squeak auf einen Sensor der Windows 7 Server and Location 
Platform zugreifen.

Die relevanten Klassen für den Zugriff auf die API werden durch die  Dateien 
sensors.h und sensorsapi.h bereitgestellt. Die Sensoren werden  in der Api nach 
verschiedenen Gesichtspunkten eingeteilt und können  dediziert angesprochen 
werden.

Für die Kommunikation mit den Sensoren werden von der API COM-Objekte benutzt.

In C++ habe ich ein kleines Beispiel Programm geschrieben, um auf den  Wert 
eines Ambient Light Sensors zuzugreifen.

Jetzt suche ich nach einer Möglichkeit, entweder direkt aus Squeak die  COM 
Objekte anzusprechen oder die Funkion in eine DLL Datei zu  verschieben und 
dann diese über FFI in squeak einzubinden.

Hat jemand schon einmal aus Squeak heraus mit COM-Objekten kommuniziert?


Mit freundlichen Grüßen

Henning
==============================================================================

Hello Squeakers,

I will communicate with COM-Objects (Component Object Model) to receive 
Information about Sensors from the Windows 7 Sensor API. 

My idea is to write a C++ function, which give me back the sensor data and put 
this function in a dll file. 

To use the sensor data in Squeak, I will call this function over the FFI 
Interface. 

It's my first project in Squeak. I don't programmed squeak before. I have no 
idea I can do this.

Is it possible to do this? Or can Squeak direct communicate with COM-Objects? 

To communicate to the Interfaces from the Sensor and Location Platform, I use 
the sensors.h and sensorsapi.h file. 

The C++ Code is:

void ALSread(double* pSenWert)
{
        ISensorManager* pSensorManager;
        ISensorCollection* pALSCollection;      
        HRESULT hr;
        PROPVARIANT SensorData;
        //double SenWert;
        //BSTR FriendlyName;
        ULONG ulCount=0;
        // 1. Initialize the COM library (make Windows load the DLLs). Normally 
you would
    // call this in your InitInstance() or other startup code.  In MFC apps, use
    //  AfxOleInit() instead.
    CoInitialize ( NULL );
    // 2. Create a COM object, using the Active Desktop coclass provided by the 
shell.
    // The 4th parameter tells COM what interface we want (ISensorManager).
        //derReferenzwert des Objektes wird auf 1 gesetzt
        hr = 
CoCreateInstance(CLSID_SensorManager,NULL,CLSCTX_INPROC_SERVER,IID_ISensorManager,(void**)&pSensorManager);
        if(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DISABLED_BY_POLICY))
        {
                // Unable to retrieve sensor manager due to 
                // group policy settings. Alert the user.
                printf("Error: unable to retrive sensor manager COM object\n");
        } 
        else
        {
                hr = 
pSensorManager->GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT,&pALSCollection);
                if (SUCCEEDED(hr)&& NULL != pALSCollection)
                {
                        printf("Auslesen der Sensorliste erfolgreich!\n");
                        hr = pALSCollection->GetCount(&ulCount);        
                        printf("\nAnzahl der gefundenen Ambient Light Sensoren: 
%u\n\n",ulCount);
                        //alle Virtual Light Sensoren auslesen
                        for (ULONG i=0; i < ulCount; i++)
                        {
                                ISensor* pSensor;
                                hr = pALSCollection->GetAt(i,&pSensor);
                                if (SUCCEEDED(hr))
                                {
                                        ISensorDataReport* pSensorDataReport;
                                        //hr = 
pSensor->GetFriendlyName(&FriendlyName);
                                        //wcout<<FriendlyName<<L'\n';
                                        hr = 
pSensor->GetData(&pSensorDataReport);
                                        hr = 
pSensorDataReport->GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,&SensorData);
                                        //cout << SensorData.vt ;
                                        //printf("Sensor Wert : %.2lf \n", 
(double)SensorData.fltVal);
                                        *pSenWert=(double)SensorData.fltVal;
                                        //printf("Sensor Wert : %.2lf \n", 
*pSenWert);
                                        pSensor->Release();
                                        pSensorDataReport->Release();
                                }
                                else
                                {
                                        printf("Error: unable to recieve 
ISensor object\n");
                                };
                        }       
                        pALSCollection->Release(); //Freigabe des Speichers
                }
                else
                {
                        printf("Error: unable to retrive Sensor List or no 
Ambient Light Sensors\n");
                };
                pSensorManager->Release(); //erniedrigt den Referenzwert des 
ISensorManager Objektes um 1 und 
                                           //wenn dieser 0 ist Wird der 
allokierte Speicherplatz wieder freigegeben
        };
}

Thanks
Henning
 
-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de

Antwort per Email an