Can I use COM-Objects in Squeak for communication

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Can I use COM-Objects in Squeak for communication

Henning Schmidt
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